MySQL 中的外鍵約束 (FOREIGN KEY) 是用來保證數(shù)據(jù)的完整性的。其中,SET NULL 級聯(lián)操作被廣泛使用。當你刪除或更新主鍵記錄時,由外鍵引用的從表記錄會發(fā)生什么呢?MySQL提供了SET NULL的操作,可以將相關從表記錄的外鍵設置為NULL。本篇文章將詳細介紹如何使用MySQL中的SET NULL級聯(lián)操作。
CREATE TABLE `customer` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(50) NOT NULL, ); CREATE TABLE `order` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `customer_id` INT NOT NULL, `order_date` DATE NOT NULL, CONSTRAINT `customer_order_fk` FOREIGN KEY (`customer_id`) REFERENCES `customer`(`id`) ON DELETE SET NULL );
上述代碼將創(chuàng)建兩個表,其中`order`表中的`customer_id`是`customer`表的外鍵約束。同時,在定義`customer_order_fk`外鍵約束時,使用了`ON DELETE SET NULL`,表明當`customer`表中的記錄被刪除時,相關的`order`表中的記錄的`customer_id`列將被設置為NULL。
看下面的例子:
INSERT INTO `customer`(`name`) VALUES ('Tom'); INSERT INTO `order`(`customer_id`, `order_date`) VALUES (1, '2022-01-01'); -- 刪除相關“Tom”記錄 DELETE FROM `customer` WHERE `id` = 1; -- 查詢order表中的數(shù)據(jù) SELECT * FROM `order`;
上述代碼將先向數(shù)據(jù)庫中的兩個表中插入數(shù)據(jù),然后刪除`customer`表中`id = 1`的記錄。最后,查詢`order`表中的數(shù)據(jù)。這時,結(jié)果為:
+----+-------------+-------------+ | id | customer_id | order_date | +----+-------------+-------------+ | 1 | NULL | 2022-01-01 | +----+-------------+-------------+
可以看到,`order`表的`customer_id`列被自動設置為NULL,保持了數(shù)據(jù)的完整性。
SET NULL級聯(lián)操作對于數(shù)據(jù)庫的性能、數(shù)據(jù)完整性等方面都有一定的影響,需要慎重使用。