MySQL数据库(十五)__2018.11.18

动态添加和删除外键:

动态删除外键: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现在已经是主流的存储引擎了,你可以大胆的进行这些操作。但是你应该有外键的这种思想,不能随便更新主表。

到此位置外键有关的操作就讲完了。

猜你喜欢

转载自blog.csdn.net/weixin_40316053/article/details/84201051
今日推荐