我正在编写一个项目并使用生成sql进行测试,但SQLite向我的代码解释。
INSERT INTO Categories
(CategoryId, Name, UrlName, CategoryIndex)
VALUES
('b2cc232c-0d5c-4f35-bb6f-29c67d7d40c2', 'Using Forums', 'usingforums', 0),
('ad9b355d-77bf-4a30-b3fe-7d562df2899f', '.NET Development', 'netdevelopment', 1),
('c4882e5e-4eb5-4e5e-b73a-3bf358bda60e', 'Visual Studio', 'visualstudio', 2),
('8c611ec3-5c2c-45c2-be01-6595b43155ee', 'Visual C#', 'visualcsharp', 3),
('c96cea21-de98-4d68-b22b-90eea66d6b77', 'Visual C++', 'visualcpp', 4),
('c6fb52d5-d4c6-48c2-8892-75f9cb330106', 'Architecture', 'architecture', 5),
('20616eb8-2273-449b-8f65-a49621b92ea4', 'SQL Server', 'sqlserver', 6)
错误: SQL执行错误。 执行的SQL语句:INSERT INTO Categories ... 错误来源:System.Data.SQLite 错误消息:SQLite错误 靠近“,”语法错误
此表的架构: 表分类( CategoryId UNIQUEIDENTIFIER非null, 名称TEXT不为null, UrlName TEXT不为null, CategoryIndex INTEGER不为null, 主键(CategoryId) )
为什么?
答案 0 :(得分:2)
SQLite doesn't allow您要使用values
子句插入多行。
尝试使用union all select
:
INSERT INTO Categories
(CategoryId, Name, UrlName, CategoryIndex)
select 'b2cc232c-0d5c-4f35-bb6f-29c67d7d40c2', 'Using Forums', 'usingforums', 0
union all select 'ad9b355d-77bf-4a30-b3fe-7d562df2899f', '.NET Development', 'netdevelopment', 1
....
答案 1 :(得分:1)
SQLite不支持多值插入语法 - 这是SQL语法的MySQL扩展。你必须将其重写为每个值的一个查询集,因此有7个不同的查询。
答案 2 :(得分:0)
因为您的SQL无效。您只能在每个INSERT语句中插入一个元组值。
答案 3 :(得分:0)
我认为这里的任何人都没有回答过这个问题 - '为什么sql lite会抱怨......'因为如果你看一下sqlite文档,它会允许在insert上添加多个值:http://www.sqlite.org/lang_insert.html,摘录: “第一个表单(使用”VALUES“关键字)在现有表中创建一个或多个新行。”
这个代码有什么问题?
INSERT INTO "roles" ("description", "name", "rid") VALUES ('Administrator','admin',2), ('Member','member',3)
发出此错误:查询错误:靠近“,”:语法错误无法执行语句
但这有效:
INSERT INTO "roles" ("description", "name", "rid") VALUES ('Administrator','admin',2)
答案 4 :(得分:0)
为了将来参考,SQLite最近添加了一项功能,允许在您的示例中按逗号分隔的每个查询包含多个条目。有关详细信息和链接,请参阅user2241515s答案。
那就是说,我已经测试了这个。对于新版本的SQLite3,它在控制台上运行(3.7.11+),至少在我的情况下。问题是各种SQL解析器可能需要一段时间才能赶上。举个例子,我正在使用Qt。在Qt应用程序执行时,在控制台中工作的相同语句不起作用。错误与上述相同:
数据库错误:接近“,”:语法错误无法执行语句
另一个可能的问题是SQLite不允许大型查询(我认为现在每个查询的限制大约是500个创建的行)。但是这个错误看起来不一样。