Ошибка дублирования 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

Ваш код хорошо работает в этой демонстрации:

http://sqlfiddle.com/#!8/87e10/1/0

Я думаю, что вы делаете второй запрос (вставить...) дважды. Попробуйте

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', вы говорите, что используете первичный ключ в своем поле чисел, поэтому он показывает повторяющуюся ошибку в поле номера. Итак, удалите этот первичный ключ, а затем вставьте его в дубликат.