[英]in mysql, on delete cascade not working
類似於ON DELETE CASCADE not working in MySQL ,但有些地方不對:
-- test delete cascade
CREATE TABLE t1(
id SERIAL PRIMARY KEY,
data TEXT
);
CREATE TABLE t2(
id INT PRIMARY KEY REFERENCES t1(id) ON DELETE CASCADE,
data2 TEXT
);
INSERT INTO t1 VALUES(1, 'one');
INSERT INTO t2 VALUES(1, 'first');
DELETE FROM t1;
SELECT * FROM t2; -- should have not rows - have one!
使用這一切Postgres的時間,但由於某種原因不能讓它在MySQL中去。
慢慢學習,有ansi-standard,postgreql方式,也有mysql方式。 每次我認為我有點欣賞這種差異時,我都沒有接近。
CREATE TABLE `t2` (
`id` BIGINT(20) UNSIGNED NOT NULL,
`data2` TEXT,
PRIMARY KEY (`id`),
CONSTRAINT `FK_t2_1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET = latin1;
對我來說,我擁有的代碼是 ansi 標准的,非常有意義,並且(就 SQL 而言)在美學上令人愉悅,而 mysql 方式(感謝您的幫助!)讓我想起了 Visual Basic 或其他東西——它真的很丑作為罪孽和恕我直言,要求聰明的人貶低自己來寫這樣的東西是錯誤的。
如果咆哮,我深表歉意,理所當然地應該得到任何數量的負面評價。 你們輕松地編寫了這段代碼,這是我最大的敬意。 我只是討厭看到這種對朋友施加的毫無意義的懲罰;-)
如果你像這樣創建 t2 它工作正常:
CREATE TABLE `t2` (
`id` bigint(20) unsigned NOT NULL,
`data2` text,
PRIMARY KEY (`id`),
CONSTRAINT `FK_t2_1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ETA,為了解決對丑陋代碼的擔憂,以下也有效:
CREATE TABLE t2 (
id bigint(20) unsigned NOT NULL PRIMARY KEY,
data2 text,
CONSTRAINT FOREIGN KEY (id) REFERENCES t1(id) ON DELETE CASCADE
) ENGINE=InnoDB ;
主要區別在於 t2.id 的數據類型必須與 t1.id 的數據類型匹配,並且必須在列之后聲明約束。
(假設應該是表 t2 中的“外鍵”而不是“主鍵”)
MySQL 只是在沒有警告的情況下忽略所有內聯外鍵約束。
因此,您需要顯式添加外鍵約束,如 dnagirl 所示。
將foreign_key_checks設置為1,我在導出和導入設置為0的數據時遇到了這個問題
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1 */;
發生這種情況是因為默認存儲引擎“MyISAM”不支持外鍵!
只需將引擎設置為 InnoDB,並使兩個表的引用和被引用列定義匹配。
這是一個例子:
CREATE TABLE `students` (
`id` INT AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`age` TINYINT NOT NULL,
PRIMARY KEY(`id`)
) ENGINE=InnoDB CHARSET=latin1;
CREATE TABLE `marks` (
`student_id` INT PRIMARY KEY,
`mark` DECIMAL(5,2) NOT NULL,
CONSTRAINT marks_FK_1 FOREIGN KEY(`student_id`) REFERENCES students(`id`) ON DELETE CASCADE
) ENGINE=InnoDB CHARSET=latin1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.