【问题标题】:MySQL auto-increment primary key causing value count mismatch and foreign-key errorMySQL自增主键导致值计数不匹配和外键错误
【发布时间】:2016-04-20 20:59:43
【问题描述】:

我有一个 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;

【问题讨论】:

标签: mysql


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    查看MySQL manual

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-28
      • 2011-07-09
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 2015-06-30
      • 2023-02-23
      • 1970-01-01
      相关资源
      最近更新 更多