Delphi SQLite插入到主键为AutoIncrement的表中

时间:2015-09-18 11:58:02

标签: sqlite delphi-xe zeos

我正在尝试将我的应用程序从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)

  1. 然后我尝试用AUTOINCREMENT替换AUTOINC并在创建AUTOINCREMENT附近的表时出现语法错误,所以我假设ZEOS不支持AUTOINCREMENT的声明?!?!

  2. 然后我尝试了没有AUTOINC,我只是将ID字段声明为

    id int(11)PRIMARY KEY,

  3. 我的代码不会给我错误,除了ID字段的值都是空的(没有自动增量)

    1. 如果我在PRIMARY KEY之后添加NOT NULL,那么我的代码会给我错误,因为我试图在NOT NULL字段中插入空值
    2. 所以,请让我知道我能做些什么来实现我的需要,而无需手动计算每个插入的下一个id值。它甚至可能吗?

1 个答案:

答案 0 :(得分:0)

Some other part of the documentation说:

  

如果声明的类型名称恰好是“INTEGER”,则PRIMARY KEY列只会变成整数主键。其他整数类型名称(如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”)会导致主键列表现为普通表列...