Ошибка дублирования MySQL MySQL, даже если нет дублирующей записи
Я использую MySQL 5.1.56, MyISAM. Моя таблица выглядит так:
CREATE TABLE IF NOT EXISTS `my_table` (
`number` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`money` int(11) NOT NULL,
PRIMARY KEY (`number`,`name`)
) ENGINE=MyISAM;
Он содержит эти две строки:
INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(1, 'S. Name', 150), (2, 'Another Name', 284);
Теперь я пытаюсь вставить другую строку:
INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(2, 'S. Name', 240);
И MySQL просто не будет вставлять его, сообщая мне следующее:
#1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'
Я действительно этого не понимаю. Первичный ключ находится в первых двух столбцах (оба они), поэтому строка, которую я пытаюсь вставить, имеет уникальный первичный ключ, не так ли?
Я попытался отремонтировать таблицу, я попытался оптимизировать таблицу, все безрезультатно. Также обратите внимание, что я не могу перейти с MyISAM на InnoDB.
Я что-то упустил или это ошибка MySQL или MyISAM? Спасибо.
Подводя итог и укажите, где я думаю, проблема (хотя ее не должно быть):
Таблица имеет первичный ключ в двух столбцах. Я пытаюсь вставить строку с новой комбинацией значений в этих двух столбцах, но значение в столбце один уже находится в некоторой строке, а значение в столбце два уже находится в другой строке. Но они нигде не объединены, поэтому я считаю, что это должно работать, и я очень смущен, увидев, что это не так.
Ответы
Ответ 1
Ваш код и схема в порядке. Вероятно, вы пытаетесь использовать предыдущую версию таблицы.
http://sqlfiddle.com/#!2/9dc64/1/0
У вашей таблицы даже нет UNIQUE, поэтому в этой таблице ошибка невозможна.
Резервное копирование данных из этой таблицы, удаление и повторное создание.
Возможно, вы попытались запустить этот CREATE TABLE IF NOT EXIST
. Он не был создан, у вас есть старая версия, но не было ошибки из-за IF NOT EXIST
.
Вы можете запустить SQL, как это, чтобы увидеть текущую структуру таблицы:
DESCRIBE my_table;
Изменить - добавлено позже:
Попробуйте запустить это:
DROP TABLE `my_table`; --make backup - it deletes table
CREATE TABLE `my_table` (
`number` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`money` int(11) NOT NULL,
PRIMARY KEY (`number`,`name`),
UNIQUE (`number`, `name`) --added unique on 2 rows
) ENGINE=MyISAM;
Ответ 2
Я знаю, что это не проблема в этом случае, но у меня была аналогичная проблема "Дублирующая запись" при создании составного первичного ключа:
ALTER TABLE table ADD PRIMARY KEY(fieldA,fieldB);
Ошибка была примерно такой:
#1062 Duplicate entry 'valueA-valueB' for key 'PRIMARY'
Итак, я искал:
select * from table where fieldA='valueA' and fieldB='valueB'
И результат показал только 1 строку, не дубликат!
Через некоторое время я узнал, что если у вас есть значения NULL в этом поле, вы получаете эти ошибки. В конце сообщение об ошибке меня вводило в заблуждение.
Ответ 3
Ваш код хорошо работает в этой демонстрации:
Я думаю, что вы делаете второй запрос (вставить...) дважды. Попробуйте
select * from my_table
прежде чем вставить новую строку, и вы получите, что ваши данные уже существуют или нет.
Ответ 4
В моем случае ошибка была вызвана устаревшей схемой, изначально был один столбец varchar(50)
, но дамп, который я пытался импортировать, был создан из модифицированной версии схемы с varchar(70)
для этого столбца (и некоторые записей этого поля, где используется более 50 символов).
Во время импорта некоторые ключи были усечены, а усеченная версия больше не была уникальной. Потребовалось время, чтобы понять это, я был как "но этот, предположительно, дублированный ключ даже не существует!".
Ответ 5
Попробуйте с автоматическим приращением:
CREATE TABLE IF NOT EXISTS `my_table` (
`number` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`money` int(11) NOT NULL,
PRIMARY KEY (`number`,`name`)
) ENGINE=MyISAM;
Ответ 6
Я только что попробовал, и если у вас есть данные и отдых в таблице не будет работать, просто измените таблицу на InnoDB и повторите попытку, это устранит проблему.
Ответ 7
Если кто-то еще найдет этот поток с моей проблемой - я использовал тип столбца "целочисленный" в MySQL. В строке, которую я пытался вставить, был добавлен первичный ключ со значением, большим, чем разрешено целым числом. Переключение на "bigint" устранило проблему.
Ответ 8
Если это помогает кому-либо помимо OP, у меня была аналогичная проблема, используя InnoDB.
Для меня, что действительно происходит, это отказ от внешнего ключа. Я ссылался на внешний ключ, которого не было.
Иными словами, ошибка была полностью отключена. Первичный ключ был прав, и вставка внешнего ключа сначала устранила проблему. Не знаю, почему MySQL внезапно ошибся.
Ответ 9
В соответствии с вашим кодом ваши "число" и "имя" являются основным ключом, и вы вставляете S.NAME в обе строки, чтобы он вступил в конфликт. мы используем primarykey для доступа к полным данным. здесь вы не можете получить доступ к данным, используя имя "primarykey".
im новичок, и я думаю, что это может быть ошибка.
Ответ 10
В моем случае ошибка была очень ошибочной. Проблема заключалась в том, что PHPMyAdmin использует "ALTER TABLE", когда вы нажимаете кнопку "сделать уникальную" вместо "ALTER IGNORE TABLE", поэтому мне пришлось делать это вручную, например, в:
ALTER TABLE mytbl ADD UNIQUE (columnName);
Ответ 11
Эта проблема часто возникает при добавлении столбца или использовании существующего столбца в качестве первичного ключа. Он не создается из-за существующего первичного ключа, который никогда не был создан или из-за повреждения таблицы.
Фактическая ошибка означает, что ожидающее значение ключа пустое.
Решение состоит в том, чтобы заполнить столбец уникальными значениями, а затем попытаться снова создать первичный ключ. Не может быть пустых, нулевых или повторяющихся значений, или эта ошибка будет отображаться.
Ответ 12
Как вы видите свою ошибку #1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'
, вы говорите, что используете первичный ключ в своем поле чисел, поэтому он показывает повторяющуюся ошибку в поле номера.
Итак, удалите этот первичный ключ, а затем вставьте его в дубликат.