Delphi SQLite插入到主键为Autoincrement的表中
我正在尝试将我的应用程序从mySQL迁移到SQLite,为此,我在SQLite中重新创建了我的所有mySQL表 我了解到一个事实,即不建议在声明实际的autoincrement字段时使用。相反,我应该声明我的autoincrement字段为主键NOTNULL,SQLite将自动递增它。 一切都很好,只是它不起作用或者我不能使用它 我将delphixe与Zeos和SQLite-3一起使用 以下是我尝试过的: 一, 如果运行上述代码,将生成表,但插入的行在ID字段中没有值(我猜是空的)Delphi SQLite插入到主键为Autoincrement的表中,sqlite,delphi-xe,zeos,Sqlite,Delphi Xe,Zeos,我正在尝试将我的应用程序从mySQL迁移到SQLite,为此,我在SQLite中重新创建了我的所有mySQL表 我了解到一个事实,即不建议在声明实际的autoincrement字段时使用。相反,我应该声明我的autoincrement字段为主键NOTNULL,SQLite将自动递增它。 一切都很好,只是它不起作用或者我不能使用它 我将delphixe与Zeos和SQLite-3一起使用 以下是我尝试过的: 一, 如果运行上述代码,将生成表,但插入的行在ID字段中没有值(我猜是空的) 然后我尝试用
我想您需要
id INTEGER主键
通常建议(除非真的需要)不要使用AUTOINCREMENT
,因为它需要在表中保留“使用过的最大值”,这会(稍微)减慢速度。显然,在声明id字段时,我应该使用INTEGER而不是INT。我将再运行一些测试,然后回到这里……SQLite接受许多关于字段定义方式的变体(尽可能与其他SQL方言“不兼容”),但很多时候它们几乎是无关的,因为任何字段都可以包含任何类型的值。少数例外情况之一是,要使主键
字段具有所需的自动生成行为,需要将其应用于整数
,而不是其任何类似的发音变体。是的,这就是我的问题。关键字是错误的。我想你想要id INTEGER主键
通常建议(除非真的需要)取消AUTOINCREMENT
,因为它涉及在表中保留“使用过的最大值”,这(稍微)显然,我应该在声明id字段时使用整数而不是INT。我将再运行一些测试,然后回到这里……SQLite接受许多关于字段定义方式的变体(尽可能与其他SQL方言“不兼容”),但很多时候它们几乎是无关的,因为任何字段都可以包含任何类型的值。少数例外情况之一是,要使主键
字段具有所需的自动生成行为,需要将其应用于整数
,而不是其任何类似的发音变体。是的,这是我的问题。关键字错误。
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'')');