外键和引用完整性

外键和引用完整性

作者:LAMP小白  点击:1953  发布日期:2012-11-11 00:20:00  返回列表
利用外键(goreign key)关系可以再某个数据表里声明与另一个数据表里的某个索引相关的关联索引,还可以把你想试驾在数据表上的约束条件放到外键关系里,让系统根据这个关系里的规则来维护数据引用的完整性

父表:包含原始数据的表
子表:引用父表中的键值的相关数据表

[CONSTRAINT constraint_name]
FOREIGN KEY [fk_name] (index_columns)
REFERENCES tbl_name (index_colums)
[ON DELETE action]
[ON UPDATE action]
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]

CONSTRAINT 如果给出,这个子句用来给外键约束关系起一个名字,如果省略innoDB将创建一个名字
FOREIGN KEY 列出子表里的被索引数据列,他们必须匹配父表里的索引值,fk_name是外键ID,如果给出innoDB能够为外键自动创建一个索引的情况下它将成为那个索引的名字
REFERENCES 子句,列出子表里的被索引数据列的名字.子表里的外键将引用这个子句所列出的父表数据列

ON DELETE 用来设定在父表里的数据行被删除时子表应该发生什么事

设置值:ON DELETE NO ACTION 和 ON DELETE RESTRICT 他们的含义与省略一样,有些数据库支持延迟检查功能,而MYSQL是立即检查,所以NO ACTION 和 RESTRICT的含义完全一样

ON DELETE CASCADE 删除父表数据行时,子表里与之相关联的数据行也将被删除

ON DELETE SET NULL 删除父表数据时,子表里与之相关的数据行将被设置为NULL

ON DELETE SET DEFAULT 这个子句可以被识别出来,但功能MYSQL尚未实现

ON UPDATE 用来设定父表里的数据行更新时子表应该发生什么事,如果为空,默认行为是拒绝插入或更新其外键值在父表索引里没有任何匹配的子表数据行,并阻止仍有子表数据行在引用他们的父表索引值被更新


建两张表
mysql> CREATE TABLE user_list
-> (
-> id INT(8) NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY(`id`),
-> name CHAR(15) NOT NULL
-> ) ENGINE=innoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.06 sec)


mysql> CREATE TABLE user_score
-> (
-> user_id INT NOT NULL,
-> score INT NOT NULL,
-> PRIMARY KEY (user_id),
-> FOREIGN KEY (user_id) REFERENCES user_list (id)
-> ON DELETE CASCADE
-> ON UPDATE CASCADE
-> ) ENGINE= innoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.13 sec)

删除父表 子表数据也同样删除了

mysql> SELECT * FROM user_list;
+----+------+
| id | name |
+----+------+
| 1 | haha |
| 2 | hehe |
+----+------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM user_score;
+---------+-------+
| user_id | score |
+---------+-------+
| 1 | 100 |
| 2 | 111 |
+---------+-------+
2 rows in set (0.00 sec)

mysql> DELETE FROM `user_list` WHERE `id`='2';
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM user_score;
+---------+-------+
| user_id | score |
+---------+-------+
| 1 | 100 |
+---------+-------+
1 row in set (0.00 sec)


上一篇:vmware怎么截图 下一篇:快递查询API
0