具有重复值约束的MySQL外键失败

时间:2014-07-03 11:42:50

标签: mysql

我有一个 id 名称的用户表

User Table:
+----+------+
| id | Name |
+----+------+
|  1 | Dan  |
+----+------+

和客户表一样,每个用户都可以拥有多个客户。

Customers Table:
+----+---------------+-------------+-------+
| id | customer_id   | user_id     | Name  |
+----+---------------+-------------+-------+
|  1 |    1          |       1     | Rito  |
|  2 |    2          |       1     | Plz   |
+----+---------------+-------------+-------+

我已经将user_id设为索引,当我尝试将其作为删除级联的外键时,它会失败并声称它是重复的。 两个键都是同一类型,两个表都是InnoDB!

这是我的要求:

ALTER TABLE `customers` 
ADD CONSTRAINT `user_id_fk`
  FOREIGN KEY (`user_id`)
  REFERENCES `users` (`id`)
  ON DELETE CASCADE
  ON UPDATE CASCADE

这是我的用户表创建代码:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(35) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

这是客户表创建代码:

SQL Statement:
CREATE TABLE `customers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `customer_id` int(11) DEFAULT NULL,
  `Name` varchar(45) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_customer_user` (`customer_id`,`user_id`),
  KEY `user_id_idx` (`user_id`),
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
  

"错误1022:不能写;表格中的重复键"

我的问题是,如何使用外键删除此表中的级联(没有触发器)?

解决:

显然副本与约束名称有关,而不是表格内数据的值。

对于未来的读者,您不能在整个数据库中使用相同的约束名称!不只是每张桌子。

1 个答案:

答案 0 :(得分:1)

错误ERROR 1022表示存在duplicate key in table,但未说明的是重复键与您在整个数据库上创建的键名相关。因此,您在表上创建的其中一个键(unique_customer_useruser_id_idxuser_id_fk)可能已存在于数据库的其他某个表中。

看一下,或者只是更改按键的名称,然后重试。