【发布时间】:2015-12-15 13:44:23
【问题描述】:
我正在尝试将我的应用程序从 mySQL 迁移到 SQLite,为了做到这一点,我在 SQLite 中重新创建了我的所有 mySQL 表。
我了解到不建议在声明实际的自动增量字段时使用 AUTOINCREMENT。而不是我应该将我的自动增量字段声明为 PRIMARY KEY NOT NULL,SQLite 会自动增加它。 一切都很好,只是它不起作用或我无法使用它。
我将 Delphi XE 与 Zeos 和 SQLite-3 一起使用
这是我尝试过的:
1.
dm.ZConnection1.Protocol := 'sqlite-3';
dm.ZConnection1.Database := 'myDB.s3db';
dm.ZConnection1.Connect;
dm.ZConnection1.ExecuteDirect('CREATE TABLE IF NOT EXISTS test ('+
' id int AUTOINC PRIMARY KEY,'+
' myval varchar(200) default NULL);');
dm.ZConnection1.ExecuteDirect('insert into test (myval) values (''first'')');
dm.ZConnection1.ExecuteDirect('insert into test (myval) values (''second'')');
dm.ZConnection1.ExecuteDirect('insert into test (myval) values (''third'')');
dm.ZConnection1.ExecuteDirect('insert into test (myval) values (''fourth'')');
如果我运行上面的代码,我的表会生成,但插入的行在 ID 字段中没有值(我猜是 NULL)
然后我尝试用 AUTOINCREMENT 替换 AUTOINC,但在 AUTOINCREMENT 附近创建表时出现语法错误,因此我认为 ZEOS 不支持声明 AUTOINCREMENT ?!?!
-
然后我尝试不使用AUTOINC,我只是将ID字段声明为
id int(11) 主键,
我的代码没有给我错误,除了 ID 字段的值都是空的(没有完成自动增量)
- 如果我在 PRIMARY KEY 之后添加 NOT NULL,那么我的代码会给我错误,因为我试图在 NOT NULL 字段中插入空值
所以请让我知道我可以做些什么来实现我所需要的,而无需手动计算每次插入时的下一个 id 值。有可能吗?
【问题讨论】:
-
我认为你想要
id INTEGER PRIMARY KEY通常建议不要使用AUTOINCREMENT(除非确实需要),因为它涉及将“曾经使用过的最大值”保留在表格中,这(稍微)会减慢速度. -
显然我应该在声明 id 字段时使用 INTEGER 而不是 INT。我将再进行一些测试,然后回到这里......
-
SQLite 接受许多关于如何定义字段的变体(尽可能与其他 SQL 方言“不兼容”),但很多时候它们几乎无关紧要,因为任何字段都可以保存值任何类型。少数例外之一是
PRIMARY KEY字段具有您想要的自动生成行为,它需要应用于INTEGER而不是任何类似的变体。 -
是的,那是我的问题。关键字错误。