簡體   English   中英

外鍵選項,ON DELETE CASCADE不起作用?

[英]The Foreign Key Options, ON DELETE CASCADE not working?

我正在嘗試對正在使用的數據庫使用ON DELETE CASCADE 似乎沒有用,所以我在一個簡單的例子上進行了測試,但沒有成功。

CREATE TABLE foo (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
data VARCHAR(10),
PRIMARY KEY (id)
)ENGINE=InnoDB;

CREATE TABLE foo2 (
id INT UNSIGNED NOT NULL,
data2 VARCHAR(10),
PRIMARY KEY (id),
CONSTRAINT fk_foo2_id FOREIGN KEY (id) REFERENCES foo(id) ON DELETE CASCADE
)ENGINE=InnoDB;

INSERT INTO foo (data) VALUE ('hello'),('world'),('mysql');
INSERT INTO foo2 (data2) VALUE ('hello2'),('world2'),('mysql2');

SELECT * FROM foo;

+----+-------+
| id | data  |
+----+-------+
|  1 | hello |
|  2 | world |
|  3 | mysql |
+----+-------+
3 rows in set (0.00 sec)

SELECT * FROM foo2;

+----+--------+
| id | data2  |
+----+--------+
|  1 | hello2 |
|  2 | world2 |
|  3 | mysql2 |
+----+--------+
3 rows in set (0.00 sec)

DELETE FROM foo WHERE id=2;

SELECT * FROM foo;
+----+-------+
| id | data  |
+----+-------+
|  1 | hello |
|  3 | mysql |
+----+-------+
2 rows in set (0.00 sec)

SELECT * FROM foo2;

+----+--------+
| id | data2  |
+----+--------+
|  1 | hello2 |
|  2 | world2 |
|  3 | mysql2 |
+----+--------+
3 rows in set (0.00 sec)

我無法為自己的生活弄清楚為什么這行不通。 我在這里查看了類似的問題和答案,我完全按照他們說的做,但仍然沒有用。 他們中的大多數人都只是說要更改為ENGINE=InnoDb ,但是我嘗試了但沒有成功。

在這里一定有我想念的東西,可能很明顯..星期一早上。

如果有人能闡明我的這個小問題,我將不勝感激!

編輯:從foo2 id中刪除了auto_increment ,因為它不屬於那里

我想到的第一件事是檢查foreign_key_checks變量的設置。 如果將其設置為0(FALSE),則不強制使用外鍵約束。

SHOW VARIABLES LIKE 'foreign_key_checks'

要啟用功能鍵約束,請將變量設置為1

SET foreign_key_checks = 1;

注意:這僅影響當前會話。 新的會話繼承了GLOBAL設置。


另外,請驗證您的表實際上正在使用InnoDB引擎,並且已定義了外鍵。 最簡單的方法是從以下位置獲取輸出:

SHOW CREATE TABLE foo;
SHOW CREATE TABLE foo2;

跟進

我們希望這不會在MySQL 5.1.61中被打破。

解決方法是,嘗試將外鍵約束定義為單獨的ALTER TABLE語句。

ALTER TABLE foo2 
ADD CONSTRAINT fk_foo2_id FOREIGN KEY (id) REFERENCES foo(id) ON DELETE CASCADE ;

我在兩個都用“ auto_increment”定義的列之間的外鍵約束中沒有看到太多用處。 在您的示例中,您可以輕松地在表“ foo”中創建幾行(在“ foo2”中沒有對應行),從那時起,您將無法控制兩個表中的“ id”值是否匹配。

我承認我沒有檢查文檔,但是如果MySQL默默地忽略了自動生成列的外鍵約束,這也不會令我感到驚訝。

IMNSHO,您的表“ foo2”應使用顯式設置的“ id”值,並引用“ foo”中的特定行,因為這樣有意義的是,刪除此類“ foo”行應級聯到“ foo2”上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM