动态添加和删除外键:
动态删除外键:alter tb_name drop foreign key fk_name;
这样就把外键删除了。
动态添加外键:alter table tb_name add foreign key (外键字段) references 主表(主键字段);
动态添加外键之前必须保证表中的记录一定是合法的记录,没有脏值,否则外键是不能添加成功的。
#删除外键
ALTER TABLE news
DROP FOREIGN KEY cateId_fk_newsCate;
#动态添加外键
ALTER TABLE news
ADD FOREIGN KEY(cateId)REFERENCES news_cate(id);
按照指定名称创建外键
#删除外键
ALTER TABLE news
DROP FOREIGN KEY news_ibfk_1;
ALTER TABLE news
ADD CONSTRAINT cateId_fk_newCate FOREIGN KEY(cateId)REFERENCES news_cate(id);
接下下来我们测试,数据表中有脏数据的时候,添加外键约束的这么一个情况。首先我们先删除外键。
INSERT news_Cate(cateName)VALUES('国内新闻'),
('国际新闻'),
('娱乐新闻'),
('体育新闻');
INSERT news(title,content,cateId)VALUES('a1','aaaa1',1),
('a2','aaaa2',1),
('a3','aaaa3',4),
('a4','aaaa4',2),
#插入一个脏数据
('a5','aaaa5',8);
ALTER TABLE news
ADD FOREIGN KEY(cateId)REFERENCES news_cate(id);
建表时可以指定外键的一个参照操作,也就是说当父表发生一些更新操作,子表的外键约束怎样改变。
外键约束的参照操作:
1.cascade:代表级联的,当我们从父表进行一些删除或更新操作,那我们的子表也会跟着对应的记录对应的字段做更新或删除操作。相当于“株连九族”。从父表删除或更新,子表也跟着删除或者更新,级联的操作。
2.set null:代表的是,当我们要删除或更新行的时候,会把子表中对应的这样一个外键列置空(设为NULL,需要保证字表的外键列允许为空)。
3.no action | restrict:拒绝对父表做更新或者删除操作。
#指定级联操作 delect cascade update cascade
ALTER TABLE news
ADD FOREIGN KEY(cateId)REFERENCES news_cate(id)
ON DELETE CASCADE ON UPDATE CASCADE;
UPDATE news_cate SET id=11 WHERE id=1;
子表分类id也会跟着父表改过来
当删除父表中的这一条记录时,子表中的这条记录也会被删除。
这就是级联的删除和更新。包括set NULL也是一样的,不过你得保证建表时该字段是允许为NULL的。否则是写入不了的。
上面我们的这些外键都是逻辑上的外键,当然以后我们在程序端,保证数据的完整性和一致性。
innodb现在已经是主流的存储引擎了,你可以大胆的进行这些操作。但是你应该有外键的这种思想,不能随便更新主表。
到此位置外键有关的操作就讲完了。