#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
), уже присутствует в какой-либо другой таблице вашей базы данных.
Посмотрите на это или просто измените имена ключей и повторите попытку.