背景:在实际操作表的时候,a表是主表,b表是外键表。当我用delete去删主表a的时候删不掉.因为有外键约束的原因,必须先删外键表b再删主表a.给外键表b插入内容,主表a没有对应的id没值也无法插入。都是因为外键约束的原因,给b表 a_id插入信息,主表a的字段id没有对应值同一样无法插入。
新增2个表a表 和b表 创建表编码如下。
id int(11) NOT NULL auto_increment,
name varchar(32) default '',
PRIMARY KEY (id))
engine=innodb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE b(
id int(11) NOT NULL auto_increment,
a_id int(11) default NULL,
name varchar(32) default '',
PRIMARY KEY (id),
FOREIGN KEY (a_id) REFERENCES a (id)
)engine=innodb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 给a表 name 字段插入一个值为'阿登哥'
insert into a (name) VALUES('阿登哥');
select * from a;
-- 给b表插入 a_id为1,name='阿登哥小弟'
insert into b (a_id,name) VALUES(1,'阿登个小弟');
select * from b;
DELETE from a where NAME='阿登哥'and id=1;
DELETE from a where NAME='阿登哥'and id=1
> 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test1`.`b`, CONSTRAINT `b_ibfk_1` FOREIGN KEY (`a_id`) REFERENCES `a` (`id`))
> 时间: 0.069s
删除a表的阿登哥会报错,因为b表的a_id引用a表的id,解决方案必须先删掉b表a_id=1,之后才能删除。
-- 如果要删除a表,a表有外键在b表,删除a表需要先删b表。
给b表 新增 a_id=2,name='阿登个小弟1',结果会报错,因为a_id=2,对应的a表id值都没有,所以无法添加。通俗一点就是小弟大哥都没有,先有大哥才能有小弟。
insert into b (a_id,name) VALUES(2,'阿登哥小弟1');
查看表编码,找到CONSTRAINT `b_ibfk_1` FOREIGN KEY (`a_id`) REFERENCES `a` (`id`)
show create table b;
查看表编码
删除外键约束
alter table b drop foreign key b_ibfk_1;
show create table b; 外键约束被删除了
-- 添加外键约束增加事件触发限制
alter table b add foreign key (a_id) references a(id) on delete cascade on update cascade;
show create table b;
cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也
更新,主键表中的记录被删除,外键表中改行也相应删除
接着再来删除 主表a里面任何字段 操作就不会报错了
DELETE from a where id=1;
SELECT * from a;
表a id=1这条记录删除成功,因为上面添加约束的时候加了一条 on delete cascade on update cascade 主表删除记录,外检表也会更正删除。
查看一下b表看看?
select *from b;
查看数据库 表 字段的编码语法
-- 查看数据库编码:
SHOW CREATE DATABASE 数据库名;
SHOW CREATE DATABASE test1;
-- 查看表编码:
SHOW CREATE TABLE 表名;
SHOW CREATE TABLE shiwu;
-- 查看字段编码:
SHOW FULL COLUMNS FROM 表名;
SHOW FULL COLUMNS FROM shiwu;
-- 查看表结构
desc 表名
SHOW COLUMNS FROM 表名;
SHOW COLUMNS FROM shiwu;