MySQL 外键约束

查看文章
MySQL 外键约束

创建测试主表. ID 是主键.
CREATE TABLE test_main (
id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);


-- 创建测试子表.
CREATE TABLE test_sub (
id INT,
main_id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);


-- 插入测试主表数据.
INSERT INTO test_main(id, value) VALUES (1, 'ONE');
INSERT INTO test_main(id, value) VALUES (2, 'TWO');

-- 插入测试子表数据.
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');
INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');


默认外键约束方式
mysql> ALTER TABLE test_sub
-> ADD CONSTRAINT main_id_cons
-> FOREIGN KEY (main_id)
-> REFERENCES test_main(id);
-> //
Query OK, 2 rows affected (0.17 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> DELETE FROM
-> test_main
-> WHERE
-> id = 1;
-> //
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constrai
nt fails (`test`.`test_sub`, CONSTRAINT `main_id_cons` FOREIGN KEY (`main_id`) R
EFERENCES `test_main` (`id`))


MySQL使用下面这个语句删除外键约束
ALTER TABLE test_sub DROP FOREIGN KEY main_id_cons;


DELETE CASCADE 方式
mysql> ALTER TABLE test_sub
-> ADD CONSTRAINT main_id_cons
-> FOREIGN KEY (main_id)
-> REFERENCES test_main(id)
-> ON DELETE CASCADE//
Query OK, 2 rows affected (0.16 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> DELETE FROM
-> test_main
-> WHERE
-> id = 1;
-> //
Query OK, 1 row affected (0.02 sec)

mysql> SELECT
-> *
-> FROM
-> test_sub;
-> //
+----+---------+--------+
| id | main_id | value |
+----+---------+--------+
| 2 | 2 | TWOTWO |
+----+---------+--------+
1 row in set (0.00 sec)


MySQL使用下面这个语句删除外键约束
ALTER TABLE test_sub DROP FOREIGN KEY main_id_cons;


UPDATE CASCADE方式
mysql> ALTER TABLE test_sub
-> ADD CONSTRAINT main_id_cons
-> FOREIGN KEY (main_id)
-> REFERENCES test_main(id)
-> ON UPDATE CASCADE;
-> //
Query OK, 1 row affected (0.14 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> UPDATE test_main SET id = 5 where id = 2
-> //
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from test_sub//
+----+---------+--------+
| id | main_id | value |
+----+---------+--------+
| 2 | 5 | TWOTWO |
+----+---------+--------+
1 row in set (0.00 sec)


MySQL使用下面这个语句删除外键约束
ALTER TABLE test_sub DROP FOREIGN KEY main_id_cons;


SET NULL方式
mysql> ALTER TABLE test_sub
-> ADD CONSTRAINT main_id_cons
-> FOREIGN KEY (main_id)
-> REFERENCES test_main(id)
-> ON DELETE SET NULL;
-> //
Query OK, 1 row affected (0.13 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> DELETE FROM
-> test_main
-> WHERE
-> id = 5;
-> //
Query OK, 1 row affected (0.05 sec)

mysql>
mysql> SELECT
-> *
-> FROM
-> test_sub;
-> //
+----+---------+--------+
| id | main_id | value |
+----+---------+--------+
| 2 | NULL | TWOTWO |
+----+---------+--------+
1 row in set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值