it-roy-ru.com

Ошибка повторяющейся записи в 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? Благодарю.

Чтобы подвести итог и указать, где, на мой взгляд, проблема (хотя не должно быть): Таблица имеет первичный ключ в двух столбцах. Я пытаюсь вставить строку с новой комбинацией значений в эти два столбца, но значение в первом столбце уже находится в некоторой строке, а значение во втором столбце уже находится в другой строке. Но они нигде не объединены, поэтому я считаю, что это должно сработать, и я очень смущен, когда вижу, что это не так.

18
user1763581

Ваш код и схема в порядке. Вы, вероятно, примеряете предыдущую версию таблицы.

http://sqlfiddle.com/#!2/9dc64/1/0

Ваша таблица даже не имеет УНИКАЛЬНОГО, так что ошибка на этой таблице невозможна.

Сделайте резервную копию данных из этой таблицы, удалите ее и создайте заново.

Может быть, вы пытались запустить этот 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;
13
Kamil

Я знаю, что это не было проблемой в этом случае, но у меня была похожая проблема «Duplicate Entry» при создании составного первичного ключа:

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, вы получаете эти ошибки. В конце концов сообщение об ошибке вводило меня в заблуждение.

8
carla

В моем случае ошибка была вызвана устаревшей схемой, один столбец изначально был varchar(50), но дамп, который я пытался импортировать, был создан из модифицированной версии схемы, которая имеет varchar(70) для этого столбца (и некоторые записи в этом поле, где используя более 50 символов).

Во время импорта некоторые ключи были усечены, и усеченная версия больше не была уникальной. Потребовалось время, чтобы понять это, я был похож на «но этого якобы дублированного ключа даже не существует!».

1
flagg19

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

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

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

select * from my_table

перед вставкой новой строки вы получите, что ваши данные уже существуют или нет.

1
Habibillah

В случае, если это помогает кому-либо, кроме OP, у меня была похожая проблема с использованием InnoDB .

Для меня на самом деле происходил сбой ограничения внешнего ключа. Я ссылался на внешний ключ, который не существовал.

Другими словами, ошибка была полностью отключена. Первичный ключ был в порядке, и вставка внешнего ключа сначала устранила проблему. Понятия не имею, почему MySQL вдруг ошибся.

0
Timo

Эта проблема часто возникает при добавлении столбца или использовании существующего столбца в качестве первичного ключа. Он не создается из-за существующего первичного ключа, который фактически никогда не создавался, или из-за повреждения таблицы.

Что на самом деле означает ошибка, так это то, что значение ожидающего ключа является пустым. 

Решение состоит в том, чтобы заполнить столбец уникальными значениями, а затем снова попытаться создать первичный ключ. Не может быть пустых, нулевых или повторяющихся значений, или появится эта вводящая в заблуждение ошибка.  

0
Robert Mauro

Попробуйте с автоматическим приращением:

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;
0
grai

В случае, если кто-то еще найдет этот поток с моей проблемой - я использовал «целочисленный» тип столбца в MySQL. Строка, которую я пытался вставить, имела первичный ключ со значением, превышающим допустимое целым числом. Переход на "bigint" исправил проблему.

0
Ben Wilson

В моем случае ошибка была очень обманчивой. Проблема заключалась в том, что PHPMyAdmin использует «ALTER TABLE» при нажатии кнопки «сделать уникальным» вместо «ALTER IGNORE TABLE», поэтому мне пришлось сделать это вручную, как в:

ALTER TABLE mytbl ADD UNIQUE (columnName);
0
Ivan Castellanos

я только что попробовал, и если у вас есть данные и воссоздание таблицы не будет работать, просто измените таблицу на InnoDB и попробуйте снова, это решит проблему

0
Janos Szabo

В соответствии с вашим кодом ваши «номер» и «имя» являются первичными ключами, и вы вставляете S.NAME в обе строки, чтобы создать конфликт. мы используем primarykey для доступа к полным данным. здесь вы не можете получить доступ к данным, используя первичный ключ 'name'. 

я новичок, и я думаю, что это может быть ошибкой. 

0
Megamind