mysql语句中外码约束导致插入失败的原因

最后一步插入失败

CREATE TABLE student(
sno INT PRIMARY KEY,
sname VARCHAR(20) NOT NULL,
sage INT DEFAULT 18
);

CREATE TABLE course(
cno INT PRIMARY KEY,
cname VARCHAR(20) NOT NULL,
ccredit INT DEFAULT 2
);

CREATE TABLE sc(
sno INT,
cno INT,
marks DECIMAL(4,1),
PRIMARY KEY(sno,cno),
FOREIGN KEY (sno) REFERENCES student(sno),
FOREIGN KEY (cno) REFERENCES course(cno)
);

ALTER TABLE sc MODIFY marks INT;
ALTER TABLE student
      ADD sgender CHAR(2),
      ADD sdept CHAR(20),
      ADD GPA DECIMAL(3,2);
ALTER TABLE course
      ADD cpre INT,
      ADD FOREIGN KEY(cpre) REFERENCES course(cno);
#为 student 表 在 sname 列上定义一个名为index_student_sname的普通索引;
CREATE INDEX index_student_sname ON student(sname);
#student 表使用四条 INSERT 语句插入四条数据;
INSERT INTO student(sno,sname,sgender,sage,sdept) VALUES (19111602,'王小珂','女',19,'信息系');
INSERT INTO student(sno,sname,sgender,sage,sdept) VALUES (19116103,'卞嘉欣','女',20,'信息系');
INSERT INTO student(sno,sname,sgender,sage,sdept) VALUES (19111604,'左眼陈','男',18,NULL);
INSERT INTO student(sno,sname,sgender,sage,sdept) VALUES (19111605,'田佳琪','女',19,'计算机系');


INSERT INTO course (cno,cname,ccredit) VALUES (1,'数据库原理',5),(2,'数学',4),(3,'操作系统',3),(4,'信息组织',4),(5,'C语言',3),(6,'数据结构',2);
UPDATE course
       SET cpre=6
       WHERE cno=1 OR cno=3;
UPDATE course
       SET cpre=1
       WHERE cno=4;
UPDATE course
       SET cpre=5
       WHERE cno=6;
UPDATE course
       SET cpre=NULL
       WHERE cno=2;
INSERT INTO sc (sno,cno,marks) VALUES (19116102,1,30),(19116102,3,87),(19116102,6,96),(19116102,1,69),(19116102,3,90);

```

最后insert sc这个表,sno写错了(19116102),和insert student表中的sno不一样(19111602),因为创建了外键引用的是student表的数据,所以给的sno必须是student表中存在的

外码约束不对你就删除以前的,自己新建一个约束:

ALTER TABLE sc DROP FOREIGN KEY sc_ibfk_1;

ALTER TABLE sc ADD CONSTRAINT sc_ibfk_1 FOREIGN KEY (sno) REFERENCES student(sno_new) ON DELETE CASCADE;


  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7806292
  • 你也可以参考下这篇文章:mysql插入语句将一张表插入另外一张表并且不重复插入
  • 你还可以看下mysql参考手册中的 MySQL 备份和恢复 将一个数据库从一个服务器复制到另一个服务器
  • 除此之外, 这篇博客: mysql 查询某字段中以逗号分隔的字符串的方法中的 一、首先讲一个需求 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 需要查出crowd_label_id 为 4,6,9的所有case_id 4,6,9为与条件

    1. 首先查询出对应case_id所有满足的标签 也就是行转列 使用GROUP_CONCAT函数在这里插入图片描述
    2. 查询出来后我们就知道对应的case_id所有的标签。
    3. 剩下就是如果根据label_id去做匹配了。这时候我们可以用到mysql函数FIND_IN_SET来匹配字符串中是否存在指定的标签。当然这一步也可以放到程序中去做判断。
      在这里插入图片描述
      结果上面完美匹配了label_id包含4,9的所有case_id

    附上sql

    SELECT * FROM (
    SELECT case_id,GROUP_CONCAT(crowd_label_id) AS aa FROM weapp_case_label WHERE crowd_label_id IN (4,6,9) GROUP BY case_id
    ) AS aaa WHERE  FIND_IN_SET('4', aa) AND FIND_IN_SET('9', aa) 
    
  • 您还可以看一下 刘运强老师的MySQL数据库从入门到实战课课程中的 如何恢复误删的数据小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    外键约束限制了插入数据的允许范围,如果在插入数据的时候存在外键约束,但是插入的数据不符合约束要求,就会插入失败。比如说,例如表A中的字段A1是表B的外键,那么在插入表A数据时,A1的值必须在表B中存在。

    解决这个问题有以下几种方案:

    1. 禁用外键约束。可以通过以下SQL语句禁用外键约束:
    SET foreign_key_checks = 0;
    

    这样在插入数据时就不会受到外键约束的限制了,但是需要注意的是,如果在禁用外键约束的情况下插入了不符合要求的数据,就会破坏数据的一致性。

    1. 修改外键约束。如果发现外键约束导致插入失败,可以修改外键约束,让插入的数据符合要求。需要先查询外键约束的定义,然后进行修改。
    SHOW CREATE TABLE table_name;
    ALTER TABLE table_name DROP FOREIGN KEY constraint_name;
    ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (field_name) REFERENCES table_name (field_name);
    

    以上命令会查看表的结构并显示外键约束的定义,然后删除原来的外键约束,再重新添加外键约束,从而保证插入的数据符合约束要求。

    1. 插入数据时符合外键约束。在插入数据之前,需要检查插入的数据是否符合外键约束的要求。如果不符合,需要修改数据使之符合要求或者插入需要的关联数据。这可以通过编写代码实现,例如在程序中进行数据校验,或者在MySQL中使用存储过程等方式来实现。这种方法可以保证数据的一致性和完整性。