MySQL自动递增主键导致值计数不匹配和外键错误

时间:2016-04-20 20:59:43

标签: php mysql database

我有一个MySQL数据库,其表格定义如下:

CREATE TABLE IF NOT EXISTS chug_dedup_instances(
left_chug_name varchar(50) NOT NULL,
FOREIGN KEY fk_left_chug_name(left_chug_name) REFERENCES chugim(name)
ON DELETE CASCADE
ON UPDATE CASCADE,
right_chug_name varchar(50) NOT NULL,
FOREIGN KEY fk_right_chug_name(right_chug_name) REFERENCES chugim(name)
ON DELETE CASCADE
ON UPDATE CASCADE,
chug_dedup_instance_id int NOT NULL AUTO_INCREMENT PRIMARY KEY)
COLLATE utf8_unicode_ci
ENGINE = INNODB;

我试图像这样插入这个表:

INSERT INTO chug_dedup_instances VALUES ("Swimming", "Swimming");

这会返回错误:

ERROR 1136 (21S01): Column count doesn't match value count at row 1

如果我删除了chug_dedup_instance_id主键,那么插入工作正常。如果我明确地给出ID值,它也有效:

mysql> INSERT INTO chug_dedup_instances VALUES ("Swimming", "Swimming", 0);
Query OK, 1 row affected (0.00 sec)

这对我来说似乎不对:数据库是否应该提供关键值?我不认为这是PHP, MySQL error: Column count doesn't match value count at row 1的重复,因为我问为什么自动增量字段没有自动添加,因为我认为它应该是。

我尝试删除主键,而是在两个主要值上使用唯一键:

UNIQUE KEY uk_chug_dedup_instances(left_chug_name, right_chug_name))

我发现当我这样做时,我无法从源表(chugim)中删除两个外键引用 - 数据库报告约束被破坏:

Cannot add or update a child row: a foreign key constraint fails    (`camprama_chugbot_db`.`chug_dedup_instances`, CONSTRAINT `chug_dedup_instances_ibfk_2` FOREIGN KEY (`right_chug_name`) REFERENCES `chugim` (`name`) ON DELETE CASCADE ON UPDATE CASCADE)

我原本期望更新子表字段,因为该表具有“ON UPDATE CASCADE”。

我已经复制了下面的源表(“chugim”)定义。任何这些问题的任何帮助将不胜感激!

CREATE TABLE IF NOT EXISTS chugim(
name varchar(50) NOT NULL,
group_id int,
FOREIGN KEY fk_group(group_id) REFERENCES groups(group_id)
ON DELETE SET NULL
ON UPDATE CASCADE,
max_size int NULL,
min_size int NULL DEFAULT 0,
description varchar(2048),
UNIQUE KEY uk_chugim(name, group_id),
chug_id int NOT NULL AUTO_INCREMENT PRIMARY KEY)
COLLATE utf8_unicode_ci
ENGINE = INNODB;

2 个答案:

答案 0 :(得分:0)

要明确:我问为什么在插入其他值时自动增量列没有自动更新。事实证明,您需要列出每个非自动递增的列名称。这有效:

INSERT INTO chug_dedup_instances (left_chug_name, right_chug_name) VALUES ("Swimming", "Swimming"); 
Query OK, 1 row affected (0.02 sec)

答案 1 :(得分:0)

检查MySQL manual

  

如果没有为INSERT ... VALUES或INSERT ... SELECT指定列名列表,则表中每列的值必须由VALUES列表或SELECT语句提供。如果您不知道表中列的顺序,请使用DESCRIBE tbl_name查找。

如果您未在INSERT语句中使用列列表,则必须以正确的顺序显式设置表中所有列的值。自动增量列没有例外。