Innodb

InnoDB 中缺少 MySql 8.0 外鍵

  • November 4, 2021

我使用 InnoDB 引擎在 MySql 8.0 中創建了 10 個表。references我使用該語句定義了關係。

當我使用 查看表時show create table,缺少外鍵。我還做了一個 mysqldump,其中的鍵也失去了。

我的外鍵去哪兒了?

這是其中一張表的範例。

create table test (
testNumber bigint not null primary key auto_increment,
productNumber bigint not null references product (productNumber) on delete cascade on update cascade 

);

CREATE TABLE請向我們展示您使用的範例。

我懷疑您使用了內聯引用(被忽略)。如果是這種情況,請參閱 MySQL 文件CREATE TABLEStatement,其中指出:

MySQL 解析但忽略“內聯REFERENCES規範”(如 SQL 標準中所定義),其中引用被定義為列規範的一部分。MySQL僅在指定為單獨****規範REFERENCES的一部分時才接受子句。有關詳細資訊,請參閱第 1.7.2.3 節,“約束差異”FOREIGN KEYFOREIGN KEY

(以上第二個文件頁面中的更多詳細資訊)。

  • MySQL 解析但忽略“內聯REFERENCES規範”(如 SQL 標準中所定義),其中引用被定義為列規範的一部分。MySQLREFERENCES僅在指定為單獨FOREIGN KEY規範的一部分時才接受子句。
  • 定義一個列以使用REFERENCES tbl_name(col_name)子句沒有實際效果,僅作為一個備忘錄或註釋,您目前定義的列旨在引用另一個表中的列。使用此語法時,重要的是要意識到:

+ MySQL 不執行任何類型的檢查來確保 col_name 確實存在於 tbl_name 中(或者甚至 tbl_name 本身存在)。 + MySQL 不會對 tbl_name 執行任何類型的操作,例如刪除行以響應對您正在定義的表中的行採取的操作;換句話說,這種語法不會導致任何ON DELETE行為ON UPDATE。(雖然你可以寫一個ON DELETEorON UPDATE子句作為子句的一部分REFERENCES它也被忽略了。) + 此語法創建一列;它不會創建任何類型的索引或鍵。

例如,以下定義創建列但不創建外鍵REFERENCES person(id)(被解析為正確但)根本沒有效果,沒有創建外鍵,也沒有索引:

CREATE TABLE shirt (
   id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
   style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
   color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
   owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
   PRIMARY KEY (id)
);

如果要在 MySQL 中創建外鍵,則必須改用以下語法 - 它確實創建了外鍵(以及索引):

CREATE TABLE shirt (
   id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
   style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
   color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
   owner SMALLINT UNSIGNED NOT NULL,
   PRIMARY KEY (id),
   FOREIGN KEY (owner) REFERENCES person(id),   -- creates an FK
);

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