Mysql

MySQL InnoDB 表接受不存在的外鍵

  • August 6, 2014

使用 EasyPHP 14.1 VC11 和 phpMyAdmin (4.1.4) 在我家的電腦上創建一個網站項目。根據 EasyPHP 管理頁面,MySQL 版本為 5.6.15。

在 Windows 7 64 位上工作。


我已經創建了我需要的表並在“關係視圖”(在“結構”選項卡上)中指定了每個外鍵。所有表都是 InnoDB,預設引擎設置為 InnoDB。


假設我有表AB,並且表B的列有一個外鍵。ID``A

在 table 中插入一行時B,如果我在外鍵列上寫 0(零)並送出,它會接受。

在“瀏覽”選項卡中,它顯示外鍵列值為 0(零)的行。

當我點擊該值(連結到表上的那一行A)時,我會以零結果轉到該表。


在變數選項卡中,“ foreign key checks”變數為“ ON”。

但是沒有檢查外鍵,否則插入會失敗,因為 table 上沒有ID0 A。我做錯了什麼或忘記了什麼?


SHOW CREATE TABLE yourtable\G同時執行表 A 和表 B 並將其發佈在問題中。– 羅蘭多MySQLDBA

表 A

CREATE TABLE `competicaogeral` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Nome` varchar(190) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Nome` (`Nome`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

表 B

CREATE TABLE `competicao` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Nome` varchar(190) NOT NULL,
`CompeticaoGeral_ID` int(10) unsigned NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Nome` (`Nome`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

請檢查FOREIGN KEY是否在您的表 B 的表設計中。

例子

CREATE TABLE projects (
   StaffID INT NOT NULL,
   ProjectName VARCHAR(20) NOT NULL,
   Allocation INT NOT NULL,
   PRIMARY KEY (StaffID, ProjectName) ,
   FOREIGN KEY (StaffID) REFERENCES Staff(StaffID) ON DELETE CASCADE
);

事實

  • 表 A 是表Staff
  • 表 B 是表projects
  • FOREIGN KEY (StaffID) REFERENCES Staff(StaffID) ON DELETE CASCADE需要StaffIDinprojects引用Staff相同的行StaffID

您的原始問題

CREATE TABLE `competicao` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Nome` varchar(190) NOT NULL,
`CompeticaoGeral_ID` int(10) unsigned NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Nome` (`Nome`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

你需要一個外鍵引用

CREATE TABLE `competicao` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Nome` varchar(190) NOT NULL,
`CompeticaoGeral_ID` int(10) unsigned NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Nome` (`Nome`),
FOREIGN KEY (CompeticaoGeral_ID) REFERENCES competicaogeral(ID) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

執行此操作的 SQL 將是

ALTER TABLE competicao ADD FOREIGN KEY (CompeticaoGeral_ID)
REFERENCES competicaogeral(ID) ON DELETE CASCADE;

試一試 !!!

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