外键用来在两个表的数据之间建立连接,它可以是一列或者多列。一个表可以有一个或者多个外键。
外键的条件:首先它是表中的一个字段,它可以不是表的主键,但对应另一张表的主键。
定义外键有什么效果:定义后,不允许删除在另一个表中具有关系的行。(通俗点的说:从表定义外键后,如果和主表的主键相关联的数据有关联,那么是不允许删除的)
外键的作用:是保持数据的一致性、完整性。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键在的那个表即是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。
[]代表可选内容。
[CONSTRAINT 外键名] FOREIGN KEY 字段名1 [,字段名2,…] REFERENCES 主表名 主键列1 [,主键列2,….]
mysql> create table zhu (
-> id int(10) primary key,
-> name varchar(222) not null );
Query OK, 0 rows affected (0.20 sec)
mysql> create table cong(
-> id int(10) primary key,
-> val varchar(22),
-> pid int(22) not null,
-> FOREIGN KEY (pid) REFERENCES zhu(id) );
Query OK, 0 rows affected (0.53 sec)
然后做一下实验
mysql> select * from zhu;
+—-+———–+
| id | name |
+—-+———–+
| 1 | 我是主 |
+—-+———–+
1 row in set (0.00 sec)
mysql> select * from cong;
+—-+———–+—–+
| id | val | pid |
+—-+———–+—–+
| 1 | 我是从 | 1 |
+—-+———–+—–+
1 row in set (0.00 sec)
mysql> delete from zhu where id =1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (test.cong, CONSTRAINT cong_ibfk_1 FOREIGN KEY (pid) REFERENCES zhu (id))
mysql> insert into zhu value(2,’222′);
Query OK, 1 row affected (0.04 sec)
mysql> select * from zhu;
+—-+———–+
| id | name |
+—-+———–+
| 1 | 我是主 |
| 2 | 222 |
+—-+———–+
2 rows in set (0.00 sec)
mysql> delete from zhu where id=2;
Query OK, 1 row affected (0.10 sec)
从上面可以看出来,当主表和从表的外键相关联,删除有关系的则会报错、没有则正常删除