我在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的同样抱怨。
谢谢, 哈
答案 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帮助的问题。答案在原始问题的评论中。