虽然输入了唯一数据,但MySql会抱怨“重复输入”

时间:2012-02-16 00:27:12

标签: mysql duplicates

我在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创建的。表创建本身不定义主键。创建表后,以下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更改为:

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

但它没有任何区别 - 来自mysql的同样抱怨。

谢谢, 哈

2 个答案:

答案 0 :(得分:1)

这对我有用。在执行insert语句之前,表是空的还是缺少这些值?

如果我运行此示例两次,我会收到一条错误消息:

  

键'PRIMARY'重复输入'1-OPEN'

首先调用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         

答案 1 :(得分:1)

找出@ kbenson帮助的问题。答案在原始问题的评论中。