为什么sqlite会抱怨这段代码?

时间:2011-10-31 18:31:45

标签: sql sqlite syntax syntax-error

我正在编写一个项目并使用生成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)     )

为什么?

5 个答案:

答案 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个创建的行)。但是这个错误看起来不一样。

相关问题