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

标签 mysql

我有一个包含id名称的用户表

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

还有一个customer表,每个用户可以有多个customer。

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

"ERROR 1022: Can't write; duplicate key in table"

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

已解决:

显然,重复项与约束名称相关,而不是表内数据的值。

对于 future 的读者,您不能在整个数据库上使用相同的约束名称!不仅仅是每张 table 。

最佳答案

错误ERROR 1022表明表中有一个重复的键,但它没有说明重复的键与您的键名称相关。正在整个数据库上创建。因此,您在表上创建的键之一(unique_customer_useruser_id_idxuser_id_fk)可能已存在于其他表中您的数据库。

看看这个,或者只是更改键的名称,然后重试。

关于具有重复值约束的 MySQL 外键失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24552796/

相关文章:

php - 在一个单元格中显示多条记录

MySQL 从连接表中返回多行作为列

python - 如何在Python中声明sql查询

php - PHP 和 MySQL 上的 Friendsystem

mysql - Sql select 一起删除

php - 如何保存 foreach 循环中的选择选项列表

mysql - mysql 数据库用户未被授权但仍然可以查询?

php - 使用 group concat 插入 Select

mysql - 如何在我的数据库中获取具有相同值的用户列表

mysql - InfluxDB 在监控中的大量使用