5、刪除被其它表關聯的主表

不善表演發表於2020-10-10

資料表之間經常存在外來鍵關聯的情況,這時如果直接刪除父表,會破壞資料表的完整性,也會刪除失敗。

刪除父表有以下兩種方法:

  • 先刪除與它關聯的子表,再刪除父表;但是這樣會同時刪除兩個表中的資料。
  • 將關聯表的外來鍵約束取消,再刪除父表;適用於需要保留子表的資料,只刪除父表的情況。

下面介紹瞭如何取消關聯表的外來鍵約束並刪除主表,也就是上面所說的刪除父表的第二種方法。

在資料庫中建立兩個關聯表。建立表 tb_emp4 的 SQL 語句如下:

CREATE TABLE tb_emp4
(
id INT(11) PRIMARY KEY,
name VARCHAR(22),
location VARCHAR (50)
);

接下來建立表 tb_emp5,SQL 語句如下:

CREATE TABLE tb_emp5
(
id INT(11) PRIMARY KEY,
name VARCHAR(25),
deptId INT(11),
salary FLOAT,
CONSTRAINT fk_emp4_emp5 FOREIGN KEY (deptId) REFERENCES tb_emp4(id)
);

tb_emp5 表為子表,具有名稱為 fk_emp4_emp5 的外來鍵約束;tb_emp4 為父表,其主鍵 id 被子表 tb_ emp5 所關聯。

刪除被資料表 tb_emp5 關聯的資料表 tb_emp4,SQL 語句如下:

mysql> DROP TABLE tb_emp4;
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

由執行結果可以看出,當主表在存在外來鍵約束時,不能被直接刪除。

下面解除子表 tb_emp5 的外來鍵約束,SQL語句和執行結果如下:

mysql> ALTER TABLE tb_emp5 DROP FOREIGN KEY fk_emp4_emp5;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

語句成功執行後,會取消表 tb_emp4 和表 tb_emp5 之間的關聯關係。

解除關聯關係後,可以使用 DROP TABLE 語句直接刪除父表 tb_emp4,SQL 語句如下:

DROP TABLE tb_emp4;

最後通過 SHOW TABLES 命令檢視資料表列表,如下所示:

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tb_emp5        |
| temp           |
+----------------+

可以發現,資料庫列表中已經不存在名稱為 tb_emp4 的表,刪除成功。

相關文章