Mysql

生成的 DDL 與 CREATE TABLE 語句不匹配

  • January 15, 2020

我正在使用帶有 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 看不到表約束與其索引之間的差異,可能會選擇其他一些工具。

引用自:https://dba.stackexchange.com/questions/257493