向存在外键的表中插入数据时出错的原因以及插入外键为空的方法

如下表

CREATE TABLE Course(
	Cno VARCHAR(4) PRIMARY KEY,
	Cname VARCHAR(20) NOT NULL,
	Cpno VARCHAR(4),
	Ccredit INT,
	FOREIGN KEY(Cpno) REFERENCES Course(Cno)
);

创建一个表,表中有一个外键,这个外键指向自己的主键,在创建表的时候是被允许的,但是在插入数据的时候,我用正常的sql语句插入数据,但报错了,如下

INSERT INTO course (cno,cname,ccredit) VALUES
	(1,'数据库',5,4),
	(2,'数学',5,2),
	(4,'操作系统',1,3),
	(3,'信息系统',6,4),
	(5,'数据结构',7,4),
	(6,'数据处理',3,2),
	(7,'PASCAL语言',null,4);

这样插入数据看似无任何问题,然鹅插入不进去,报错提示外键没有default,最后想了想,原因是
外键的数据来源于主键表里的数据,也就是说主键表里如果没有这个数据外键表是插不进去的,你必须先在主键表插入进去了才能在外键表插入。主键表的主键字段不能重复哦。重复了也插不进的。

那我就可以先把其他的数据插进去,先不插入外键,这不就行了,然鹅,报错了。原因我要插入的部分外键为空,但是写成null也不能插入,不写也不能插入,这样就无解了。后来的解决办法是先把外键删了,插完数据再添加上外键。建议在建表的时候先不添加外键约束,添加完数据后再添加外键

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
触发器是数据库中一种特殊的存储过程,它可以在某个表上进行操作自动执行。根据题目要求,我们可以设计以下触发器。 1. 删除同学选课触发器 当在student表中删除一条记录,需要同删除对应的选课记录。我们可以在选课表SC上创建一个触发器,在删除学生记录自动删除对应的选课记录。触发器如下: ```sql CREATE TRIGGER delete_sc_trigger AFTER DELETE ON student FOR EACH ROW BEGIN DELETE FROM SC WHERE SC.Sno = OLD.Sno; END; ``` 2. 拒绝插入存在的同学记录触发器 当在student表中插入一条记录,需要判断该同学是否已经存在。我们可以在student表上创建一个BEFORE INSERT触发器,在插入记录之前自动检查同学是否已经存在。如果存在,则拒绝插入该记录。触发器如下: ```sql CREATE TRIGGER insert_student_trigger BEFORE INSERT ON student FOR EACH ROW BEGIN IF EXISTS(SELECT * FROM student WHERE student.Sno = NEW.Sno) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '此记录无效'; END IF; END; ``` 3. 年龄不得小于18岁触发器 当在student表中插入或修改记录,需要判断学生的年龄是否小于18岁。如果小于18岁,则将年龄改为18岁。我们可以在student表上创建一个BEFORE INSERT和BEFORE UPDATE触发器,在插入或更新记录之前自动检查学生年龄。如果年龄小于18岁,则将年龄改为18岁。触发器如下: ```sql CREATE TRIGGER age_trigger BEFORE INSERT, UPDATE ON student FOR EACH ROW BEGIN IF NEW.age < 18 THEN SET NEW.age = 18; END IF; END; ``` 4. 检查课程是否被选修触发器 当在course表中删除一条记录,需要先检查该课程是否有被选修记录。如果有,则提示出错并回滚操作。我们可以在选课表SC上创建一个BEFORE DELETE触发器,在删除课程记录之前自动检查该课程是否有被选修记录。如果有,则提示出错并回滚操作。触发器如下: ```sql CREATE TRIGGER check_sc_trigger BEFORE DELETE ON course FOR EACH ROW BEGIN IF EXISTS(SELECT * FROM SC WHERE SC.Cno = OLD.Cno) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '该课程有被选修记录,无法删除'; ROLLBACK; END IF; END; ``` 5. 检查外键约束触发器 当在SC表中插入一条记录,需要检查插入数据的课程号是否存在于Course表中。我们可以在SC表上创建一个BEFORE INSERT触发器,在插入记录之前自动检查课程号是否存在。如果不存在,则提示出错。触发器如下: ```sql CREATE TRIGGER check_course_trigger BEFORE INSERT ON SC FOR EACH ROW BEGIN IF NOT EXISTS(SELECT * FROM course WHERE course.Cno = NEW.Cno) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '课程号不存在于Course表中'; END IF; END; ``` 注意:在创建第5个触发器之前,需要先删除SC表中Cno的外键约束。 以上是触发器的设计和实现。在实际应用中,需要根据具体的业务需求来设计触发器,保证数据的完整性和一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值