簡體   English   中英

在 mysql 中,刪除級聯不起作用

[英]in mysql, on delete cascade not working

類似於ON DELETE CASCADE not working in MySQL ,但有些地方不對:

ANSI方式

-- 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方式。 每次我認為我有點欣賞這種差異時,我都沒有接近。

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.

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