MySql жалуется на «Двойную запись», хотя вводятся уникальные данные - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть эта таблица в базе данных mysql:

mysql> show columns from wifi_network_config_auth_algorithm;
+------------------------+-------------+------+-----+---------+-------+
| Field                  | Type        | Null | Key | Default | Extra |
+------------------------+-------------+------+-----+---------+-------+
| wifi_network_config_id | int(11)     | NO   | PRI | NULL    |       | 
| auth_algorithm         | varchar(50) | NO   | PRI | NULL    |       | 
+------------------------+-------------+------+-----+---------+-------+

Таблица была создана с использованием ликвидазы. Само создание таблицы не определяет первичные ключи. После создания таблицы следующая команда liquibase используется для установки комбинации из 2 столбцов в качестве первичного ключа:

<addPrimaryKey tableName="wifi_network_config_auth_algorithm"
        columnNames="wifi_network_config_id,auth_algorithm"
        constraintName="pk_wifi_network_config_auth_algorithm"/>

Теперь, когда вы выполните это для загрузки данных в эту таблицу:

LOCK TABLES `wifi_network_config_auth_algorithm` WRITE;
INSERT INTO `wifi_network_config_auth_algorithm` VALUES
(1, 'OPEN'),
(1, 'SHARED'),
(2, 'SHARED'),
(2, 'LEAP');
UNLOCK TABLES;

Вы получаете:

ERROR 1062 (23000): Duplicate entry '1' for key 2

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

Кроме того, он жалуется, что значение «1» присваивается клавише 2, что не имеет смысла. Я изменил ВСТАВКУ на:

INSERT INTO `wifi_network_config_auth_algorithm` (`wifi_network_config_id`, `auth_algorithm`)

но это не имело никакого значения - та же самая жалоба от mysql.

Спасибо, Хари

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Разобрался с помощью @ kbenson. Ответ в комментариях к исходному вопросу.

1 голос
/ 16 февраля 2012

Это работает для меня.Таблица пуста или пропускает эти значения до того, как вы выполните оператор вставки?

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

Дублирующая запись '1-OPEN'ключ 'PRIMARY'

Вызов DELETE FROM wifi_network_config_auth_algorithm сначала позволяет избежать этого.

В противном случае должно быть что-то не так с тем, как был создан первичный ключ, поскольку ваше сообщение об ошибке отличается.*

Я создал тестовую таблицу, используя следующее:

CREATE TABLE `test` (
          `wifi` int(11) NOT NULL,
          `auth` varchar(50) NOT NULL,
          PRIMARY KEY (`wifi`,`auth`)
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1         
...