1

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

并且我的代码没有给我错误,除了 ID 字段的值都是空的(没有完成自动增量)

  1. 如果我在 PRIMARY KEY 之后添加 NOT NULL,那么我的代码会给我错误,因为我试图在 NOT NULL 字段中插入空值

所以请让我知道我能做些什么来实现我需要的,而不必手动计算每个插入的下一个 id 值。甚至可能吗?

4

1 回答 1

0

文档的其他部分说:

如果声明的类型名称恰好是“INTEGER”,则 PRIMARY KEY 列仅成为整数主键。其他整数类型名称,如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”会导致主键列表现为普通表列……</p>

于 2015-09-18T13:52:15.077 回答