2011-04-21 142 views
7

我有这个表:SQL列计数不匹配值计数错误

CREATE TABLE `message` (
    `m_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `p_id` VARCHAR(30) NOT NULL, 
    PRIMARY KEY (`m_id`) 
) 
ENGINE=InnoDB 
ROW_FORMAT=DEFAULT 

与此插入

INSERT INTO `message` VALUES ('7'); 

,我收到一个“列数不匹配行值数”错误。它应该正常工作,因为主键是auto_increment

+0

您在关闭句子中的假设对MySQL无效,也可能适用于其他DBMS。 – Johan 2011-04-21 15:38:47

回答

12

通常,当您有自动递增字段时,您不想指定该列的值。也就是说,您从VALUES中删除该值。

然而,正如Johan指出的那样,只要表中列的数量与列数不匹配,您就必须在目标表上指定列列表。

其良好的实践情况做反正列或列顺序改变数

INSERT INTO 
message 
(p_id) 
Values ('7') 
+0

-1 @Conrad,你说你可以用类似insert的方式逃脱:插入消息值('7')否我不认为这将在MySQL中起作用。 – Johan 2011-04-21 15:34:18

+0

@Johan。我已经更新了我的答案,以便清楚。如果没有AUTO_INCREMENT字段,则可以省略目标列名称。 – 2011-04-21 15:45:28

+0

显示的代码将起作用,但请注意,这不取决于自动增量列。如果#of columns = #of插入的列,那么无论自动增量(y/n),键(y/n)或其他什么,MySQL都很高兴。 – Johan 2011-04-21 15:50:37

4

您需要指定要插入的列。如果您不知道数据库,则假定您提供的值是每列的值,并按照架构的确切顺序排列。尝试下面的语句。

INSERT INTO `message` (p_id) VALUES ('7'); 

此外,总是在插入语句中指定列是一种很好的做法。它有助于提高可读性。

6

当值的数目不等于列数必须指定列名:

INSERT INTO message (p_id) VALUES ('7'); 
0

试试这个:

INSERT INTO `message` (p_id) VALUES ('7'); 

你不是指定的列,其中有2个,一个d试图插入1值。

0

也许,如果你这样做

INSERT INTO message (p_id) VALUES ("7"); 
0

你可以做到这一点

INSERT INTO `message` VALUES (NULL, '7'); 

这将匹配列数而忽略了零插入到自动增量ID和插入auto increment值;

相关问题