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

Delphi SQLite插入到主键为Autoincrement的表中,sqlite,delphi-xe,zeos,Sqlite,Delphi Xe,Zeos,我正在尝试将我的应用程序从mySQL迁移到SQLite,为此,我在SQLite中重新创建了我的所有mySQL表 我了解到一个事实,即不建议在声明实际的autoincrement字段时使用。相反,我应该声明我的autoincrement字段为主键NOTNULL,SQLite将自动递增它。 一切都很好,只是它不起作用或者我不能使用它 我将delphixe与Zeos和SQLite-3一起使用 以下是我尝试过的: 一, 如果运行上述代码,将生成表,但插入的行在ID字段中没有值(我猜是空的) 然后我尝试用

我正在尝试将我的应用程序从mySQL迁移到SQLite,为此,我在SQLite中重新创建了我的所有mySQL表

我了解到一个事实,即不建议在声明实际的autoincrement字段时使用。相反,我应该声明我的autoincrement字段为主键NOTNULL,SQLite将自动递增它。 一切都很好,只是它不起作用或者我不能使用它

我将delphixe与Zeos和SQLite-3一起使用

以下是我尝试过的:

一,

如果运行上述代码,将生成表,但插入的行在ID字段中没有值(我猜是空的)

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

  • 然后我尝试不使用AUTOINC,我只是将ID字段声明为

    id int(11)主键

  • 我的代码不会给我错误,除了ID字段的值都是空的(没有进行AUT增量)

  • 如果我在主键之后添加NOTNULL,那么我的代码会给我错误,因为我试图在NOTNULL字段中插入NULL值
  • 因此,请让我知道我能做些什么来实现我所需要的,而不必在每次插入时手动计算我的下一个id值。甚至有可能吗?

    说:

    仅当声明的类型名称正好是“整数”时,主键列才成为整数主键。其他整数类型名称,如“INT”或“BIGINT”或“SHORT integer”或“UNSIGNED integer”,会导致主键列表现为普通表列

    说:

    仅当声明的类型名称正好是“整数”时,主键列才成为整数主键。其他整数类型名称,如“INT”或“BIGINT”或“SHORT integer”或“UNSIGNED integer”,会导致主键列表现为普通表列


    我想您需要
    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'')');