列数和值之间如何不匹配?

时间:2014-07-13 09:16:11

标签: mysql sql

这是一个MySQL 5.5 DB。您应该能够使用以下语法插入多行值:

INSERT INTO tbl_name (a,b,c)
VALUES(1,2,3), (4,5,6), (7,8,9);

但是我在以下查询中收到错误(“列数与第1行的值计数不匹配”):

INSERT INTO users_X_shareItems (userID, itemID, userAction, detail, actionDate)
VALUES ('CB381FC5-6373-4D01-A2ED-01CEACFA750B'), 
    ('16nhbfsg6apltgtfhjkb29z4w'),
    ('like'),
    (''),
    (NULL)

我的计算技巧是否有缺陷,或者那里有五列价值?在这种情况下,只有一行的数据;因此每组括号中只有一个值。但构建此查询的PHP函数需要任意数量的行数据,这是一个功能要求。

请注意,在顶部的示例中,直接来自MySQL文档,括号应该告诉引擎这些是LISTS值。让我们来看一个例子并修改一个你只添加一行值的实例:

INSERT INTO tbl_name (a,b,c)
VALUES(1), (4), (7);

文档的措辞含糊不清,所以我将按照一些人的建议重新组织查询。

3 个答案:

答案 0 :(得分:2)

我怀疑你从不同的评论中假设INSERT语句的作用类似于接受变量参数的函数(例如COALESCE()CONCAT_WS())。事实并非如此:不是一个功能,你需要在每个列表上使用相同的项目数:

INSERT INTO foo (a) VALUES
(?),
(?),
(?),
(?),
(?);
INSERT INTO foo (a, b) VALUES
(?, ?),
(?, ?),
(?, ?),
(?, ?),
(?, ?);
INSERT INTO foo (a, b, c) VALUES
(?, ?, ?),
(?, ?, ?),
(?, ?, ?),
(?, ?, ?),
(?, ?, ?);

......但永远不会:

-- Not valid
INSERT INTO foo (a, b) VALUES
(?),
(?, ?),
(?, ?, ?);

如果表格设计允许,则某些实际值可以是NULL,但不可能完全省略它们。

如果需要处理不同的列数,则必须动态构建SQL代码。在大多数编程语言中,这是微不足道的。


刚看到你的编辑。你误解了多行语法。它不是这样的:

-- Not valid
INSERT INTO person (name, age) values
('Abe', 'Bill', 'Charles'),
(23, 45, 17);

它是这样的:

INSERT INTO person (name, age) values
('Abe', 23),
('Bill', 45),
('Charles', 17);

答案 1 :(得分:1)

为什么在每个单值后关闭VALUES括号? SQL知道您希望添加5个不同的行,每行只包含一个值,但您说您将提供五个值。所以你的查询应该是

INSERT INTO users_X_shareItems (userID, itemID, userAction, detail, actionDate) VALUES
('CB381FC5-6373-4D01-A2ED-01CEACFA750B', '16nhbfsg6apltgtfhjkb29z4w', 'like', '', NULL);

修改 如果要在一个查询中添加更多行,则仍需提供这5个值。见这个例子

INSERT INTO users_X_shareItems (userID, itemID, userAction, detail, actionDate) VALUES
    ('CB381FC5-6373-4D01-A2ED-01CEACFA750B', '16nhbfsg6apltgtfhjkb29z4w', 'like', '', NULL),
    ('row2', 'row2', 'like', '', NULL),
    ('row3', 'row3', 'like', '', NULL);

答案 2 :(得分:1)

正确的语法:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

但是在你的情况下,你这样做了:

INSERT INTO tbl_name (a,b,c,d,e) VALUES('1'),('2'),('3'),('4'),('5');

括号中的项目总数必须与列总数相同,每行只插入1个值,这会导致不匹配错误。

只需将其更改为:

INSERT INTO users_X_shareItems (userID, itemID, userAction, detail, actionDate) VALUES ('CB381FC5-6373-4D01-A2ED-01CEACFA750B','16nhbfsg6apltgtfhjkb29z4w','like','', NULL)