Mysql
生成的 DDL 與 CREATE TABLE 語句不匹配
我正在使用帶有 InnoDB 引擎的 MySQL。我創建一個包含外鍵的新表,例如:
CREATE TABLE rooms ( id INTEGER NOT NULL AUTO_INCREMENT, my_id VARCHAR(15), house_id INTEGER, PRIMARY KEY (id), FOREIGN KEY(house_id) REFERENCES houses (id) ON DELETE CASCADE )
當我使用 DBeaver 等數據庫工具查看我的數據庫和此表的詳細資訊時,我發現我的外鍵
house_id
缺少ON DELETE CASCADE
設置。DBeaver 還顯示了該表的 DDL,如下所示:
CREATE TABLE `rooms` ( `id` int(11) NOT NULL AUTO_INCREMENT, `my_id` varchar(15) COLLATE utf8mb4_general_ci DEFAULT NULL, `house_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `house_id` (`house_id`), CONSTRAINT `rooms_ibfk_1` FOREIGN KEY (`house_id`) REFERENCES `houses` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
為什麼 DDL 有多餘的行
KEY 'house_id' ('house_id').
?這個額外的行還導致我的外鍵house_id
在我的 DBeaver 表查看器中顯示 2 列。如果我擺脫這個,我ON DELETE CASCADE
的設置正確。我正在使用 ORM,所以我無法控制
CREATE TABLE
語句,所以我只是想至少了解這裡發生了什麼。謝謝,
正如手冊所說(強調我的):
MySQL 需要外鍵和引用鍵上的索引,以便外鍵檢查可以快速且不需要表掃描。在引用表中,必須有一個索引,其中外鍵列按相同順序列為第一列。如果引用表不存在,則會自動在引用表上創建此類索引。
換句話說,這是一種預期的、記錄在案的行為。如果 DBeaver 看不到表約束與其索引之間的差異,可能會選擇其他一些工具。