Сбой внешнего ключа MySQL с ограничениями на повторяющиеся значения

#mysql

#mysql

Вопрос:

У меня есть таблица пользователя с идентификатором и именем

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

В таблице 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
  

«ОШИБКА 1022: не удается записать; дубликат ключа в таблице»

Мой вопрос в том, как я могу выполнить каскад удаления в этой таблице (без триггеров) с использованием внешних ключей?

Решаемая:

По-видимому, дубликат был связан с именем ограничения, а не со значениями данных внутри таблицы.

Для будущих читателей, вы не можете использовать одно и то же имя ограничения во всей базе данных! не только для таблицы.

Комментарии:

1. Не могли бы вы, пожалуйста, скопировать / вставить запрос, используемый для добавления этого FOREIGN KEY ?

2. Пожалуйста, отправьте show create table User и show create table Customers .

3. @ zessx сделал это, это то, что вы хотели?

4. @DalaiLama Это так. Не могли бы вы проверить, что в этой таблице user_id_fk ничего уже не установлено?

5. Вы не можете использовать одно и то же имя для ограничения внешнего ключа в разных таблицах.

Ответ №1:

В ошибке ERROR 1022 указано, что существует duplicate key in table , но чего в ней не указано, так это того, что дубликат ключа связан с именем ключа, которое вы создаете для всей базы данных. Таким образом, возможно, что один из ключей, которые вы создаете в своей таблице ( unique_customer_user , user_id_idx , user_id_fk ), уже присутствует в какой-либо другой таблице вашей базы данных.

Посмотрите на это или просто измените имена ключей и повторите попытку.