MySQL: 非重复键的重复键错误 1022
MySQL: Duplicate Key Error 1022 for non duplicate key
我正在尝试创建具有不同外键约束的 table,但 mysql 抱怨此 DDL:
CREATE TABLE tasks (
id INTEGER NOT NULL AUTO_INCREMENT,
`createdAt` DATETIME NOT NULL DEFAULT now(),
`updatedAt` DATETIME NOT NULL DEFAULT NOW() ON UPDATE NOW(),
`createdBy_user_id` INTEGER NOT NULL,
`updatedBy_user_id` INTEGER NOT NULL,
status ENUM('open','closed') NOT NULL,
customer_id INTEGER NOT NULL,
`projectDescription` TEXT,
PRIMARY KEY (id),
CONSTRAINT user_id_fk FOREIGN KEY(`createdBy_user_id`) REFERENCES users (id),
CONSTRAINT customer_id_fk FOREIGN KEY(customer_id) REFERENCES `Customer` (id),
CONSTRAINT user_up_id_fk FOREIGN KEY(`updatedBy_user_id`) REFERENCES users (id)
)COLLATE utf8mb4_german2_ci CHARSET=utf8mb4
我收到错误 ERROR 1022 (23000): Can't write; duplicate key in table 'tasks'
,这毫无意义,因为每个约束都有不同的名称并且应用于不同的列。
奇怪的是,如果我删除 fk
后缀并用 constr
.
之类的东西替换它,MySQL 不会抱怨
有人知道为什么 MySQL 5.7 (Server version: 5.7.30-33 Percona Server (GPL), Release 33, Revision 6517692
) 会这样吗?
您在另一个 table.
中使用了同名约束
这是一种轻松重现此问题的方法:
CREATE TABLE foo
(
id int not null auto_increment primary key
);
CREATE TABLE bar
(
id int not null auto_increment primary key,
foo_id int,
CONSTRAINT foo_id_fk FOREIGN KEY(`foo_id`) REFERENCES foo(id) -- <- Check this constraint name
);
CREATE TABLE hello
(
id int not null auto_increment primary key,
foo_id int,
CONSTRAINT foo_id_fk FOREIGN KEY(`foo_id`) REFERENCES foo(id) -- <-- same constraint name than before
);
Schema Error: Error: ER_DUP_KEY: Can't write; duplicate key in table 'hello'
要解决此问题,请确保 FK 名称是唯一的。您可以省略约束的命名,因此 MySQL 将为您创建一个。
-- v----------- no name here
CONSTRAINT FOREIGN KEY(`createdBy_user_id`) REFERENCES users (id)
或者您可以使用 naming convention
我正在尝试创建具有不同外键约束的 table,但 mysql 抱怨此 DDL:
CREATE TABLE tasks (
id INTEGER NOT NULL AUTO_INCREMENT,
`createdAt` DATETIME NOT NULL DEFAULT now(),
`updatedAt` DATETIME NOT NULL DEFAULT NOW() ON UPDATE NOW(),
`createdBy_user_id` INTEGER NOT NULL,
`updatedBy_user_id` INTEGER NOT NULL,
status ENUM('open','closed') NOT NULL,
customer_id INTEGER NOT NULL,
`projectDescription` TEXT,
PRIMARY KEY (id),
CONSTRAINT user_id_fk FOREIGN KEY(`createdBy_user_id`) REFERENCES users (id),
CONSTRAINT customer_id_fk FOREIGN KEY(customer_id) REFERENCES `Customer` (id),
CONSTRAINT user_up_id_fk FOREIGN KEY(`updatedBy_user_id`) REFERENCES users (id)
)COLLATE utf8mb4_german2_ci CHARSET=utf8mb4
我收到错误 ERROR 1022 (23000): Can't write; duplicate key in table 'tasks'
,这毫无意义,因为每个约束都有不同的名称并且应用于不同的列。
奇怪的是,如果我删除 fk
后缀并用 constr
.
有人知道为什么 MySQL 5.7 (Server version: 5.7.30-33 Percona Server (GPL), Release 33, Revision 6517692
) 会这样吗?
您在另一个 table.
中使用了同名约束这是一种轻松重现此问题的方法:
CREATE TABLE foo
(
id int not null auto_increment primary key
);
CREATE TABLE bar
(
id int not null auto_increment primary key,
foo_id int,
CONSTRAINT foo_id_fk FOREIGN KEY(`foo_id`) REFERENCES foo(id) -- <- Check this constraint name
);
CREATE TABLE hello
(
id int not null auto_increment primary key,
foo_id int,
CONSTRAINT foo_id_fk FOREIGN KEY(`foo_id`) REFERENCES foo(id) -- <-- same constraint name than before
);
Schema Error: Error: ER_DUP_KEY: Can't write; duplicate key in table 'hello'
要解决此问题,请确保 FK 名称是唯一的。您可以省略约束的命名,因此 MySQL 将为您创建一个。
-- v----------- no name here
CONSTRAINT FOREIGN KEY(`createdBy_user_id`) REFERENCES users (id)
或者您可以使用 naming convention