MySQL 拒绝带有 ON DELETE SET NULL 但不是 ON DELETE CASCADE 的列

MySQL rejects column with ON DELETE SET NULL but not ON DELETE CASCADE

我有一个简单的 MySQL 数据库,在某些 table 列上有一些外键。一些外键列被设置为 ON DELETE SET NULL,它似乎工作正常。但是,对于其中一个 table,我无法配置 ON DELETE SET NULL - 我只能配置 ON DELETE CASCADE。

最初的 table 看起来像这样:

CREATE TABLE sessions(
session_id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(50) NOT NULL,
UNIQUE KEY uk_sessions(name))
COLLATE utf8_unicode_ci;

CREATE TABLE blocks(
block_id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(50) NOT NULL,
UNIQUE KEY uk_blocks(name))
COLLATE utf8_unicode_ci;

CREATE TABLE edot(
edah_id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(50) NOT NULL,
UNIQUE KEY uk_edot(name))
COLLATE utf8_unicode_ci;

CREATE TABLE campers(
camper_id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
edah_id int,
FOREIGN KEY fk_edah_id(edah_id) REFERENCES edot(edah_id)
ON DELETE SET NULL
ON UPDATE CASCADE,
session_id int,
FOREIGN KEY fk_session_id(session_id) REFERENCES sessions(session_id)
ON DELETE SET NULL
ON UPDATE CASCADE,
first varchar(50) NOT NULL,
last varchar(50) NOT NULL,
email varchar(50) NOT NULL,
needs_first_choice bool DEFAULT 0,
active bool NOT NULL DEFAULT 1)
COLLATE utf8_unicode_ci;

以上一切正常。当我尝试这样做时出现问题:

CREATE TABLE block_instances(
block_id int NOT NULL,
FOREIGN KEY fk_block_id(block_id) REFERENCES blocks(block_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
session_id int,
FOREIGN KEY fk_session_id(session_id) REFERENCES sessions(session_id)
ON DELETE SET NULL
ON UPDATE CASCADE,
PRIMARY KEY pk_block_instances(block_id, session_id))
COLLATE utf8_unicode_ci;

这个returns

ERROR 1005 (HY000): Can't create table 'chugbot_db.block_instances' (errno: 150)

如果我将第二个 ON DELETE SET NULL 更改为 ON DELETE CASCADE,错误就会消失:

CREATE TABLE block_instances(
block_id int NOT NULL,
FOREIGN KEY fk_block_id(block_id) REFERENCES blocks(block_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
session_id int,
FOREIGN KEY fk_session_id(session_id) REFERENCES sessions(session_id)
ON DELETE **CASCADE**
ON UPDATE CASCADE,
PRIMARY KEY pk_block_instances(block_id, session_id))
COLLATE utf8_unicode_ci;

工作正常。

谁能告诉我在 block_instances table 中使用 ON DELETE SET NULL 有什么问题吗?好像和campers里面的ON DELETE SET NULL一模一样table.

这原来是 MySQL 中的错误:

http://bugs.mysql.com/bug.php?id=80052