二十五岁时我们都一样愚蠢、多愁善感,喜欢故弄玄虚,可如果不那样的话,五十岁时也就不会如此明智。
标题:SQL FOREIGN KEY 约束
什么是
FOREIGN KEY
? 就是在一个表中存储另一个表的主键 ( PRIMARY KEY )就比如之前我们创建的两个表
CREATE TABLE `lession` ( id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, name varchar(32) default '', views int(11) NOT NULL default '0', created_at DATETIME ); CREATE TABLE `lession_views` ( uniq bigint(20) primary key NOT NULL default '0' , lession_name varchar(32) default '', lession_id int(11) default '0', date_at int(11) NOT NULL default '0', views int(11) NOT NULL default '0' );
lession_views
中的lession_id
就是lession
表中的主键id
很多人都会有疑问,那我们一般不都是这么建表的? 难道添加的就是
lession_id
就是FOREIGN KEY
不是的。我们这么添加,是因为我们开发团队有共识,但是,这种共识数据库系统不认识啊
如果不给
lession_id
添加FOREIGN KEY
约束,数据库系统会以为lession_id
只不过是一个普通的int(11)
字段FOREIGN KEY 有什么作用?
- FOREIGN KEY 约束用于预防破坏表之间连接的行为
- FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一
两个作用简单明了
当删除一个 FOREIGN KEY 指向的主表 (lession) 记录时,如果 FOREIGN KEY 所在的表 (lession_views) 存在记录,那么会删除失败
当在 FOREIGN KEY 表 ( lession_views ) 插入或更新一条记录,如果 FOREIGN KEY 指向的主表 ( lession ) 不存在该记录,那么插入或者更新失败
CREATE TABLE 时的 SQL FOREIGN KEY 约束
给一个表添加
FOREIGN KEY
约束可以使用FOREIGN KEY
关键字例如我们给
lession_views
的lession_id
添加外键约束,可以使用下面的 SQL 语句MySQL
CREATE TABLE `lession_views` ( uniq bigint(20) primary key NOT NULL default '0' , lession_name varchar(32) default '', lession_id int(11) default '0', date_at int(11) NOT NULL default '0', views int(11) NOT NULL default '0', FOREIGN KEY (lession_id) REFERENCES lession(id) );SQL Server / Oracle / MS Access
CREATE TABLE `lession_views` ( uniq bigint(20) primary key NOT NULL default '0' , lession_name varchar(32) default '', lession_id int(11) FOREIGN KEY REFERENCES lession(id), date_at int(11) NOT NULL default '0', views int(11) NOT NULL default '0' );给 FOREIGN KEY 命名
如果想要给 FOREIGN KEY 约束命名,可以使用
CONSTRAINT
关键字,就像下面的 SQL 语句CREATE TABLE `lession_views` ( uniq bigint(20) primary key NOT NULL default '0' , lession_name varchar(32) default '', lession_id int(11) default '0', date_at int(11) NOT NULL default '0', views int(11) NOT NULL default '0', CONSTRAINT fk_lession_id FOREIGN KEY (lession_id) REFERENCES lession(id) );ALTER TABLE 时的 SQL FOREIGN KEY 约束
如果一个表已经被创建,我们仍然可以使用
ALTER TABLE FOREIGN KEY
来添加外键约束例如下面的 SQL 语句,给
lession_views
表的lession_id
字段添加外键约束MySQL / SQL Server / Oracle / MS Access
ALTER TABLE lession_views ADD FOREIGN KEY (lession_id) REFERENCES lession(id);如果还想给 FOREIGN KEY 约束命名,则可以像下面这样使用
MySQL / SQL Server / Oracle / MS Access
ALTER TABLE lession_views ADD CONSTRAINT fk_lession_id FOREIGN KEY (lession_id) REFERENCES lession(id);删除 FOREIGN KEY 约束
如果想要删除一个已经命名的
FOREIGN KEY
约束,可以使用DROP
关键字MySQL
ALTER TABLE lession_views DROP FOREIGN KEY fk_lession_id;SQL Server / Oracle / MS Access
ALTER TABLE lession_views DROP CONSTRAINT fk_lession_id;