【问题标题】:Delphi SQLite insert into a table with primary key as AutoincrementDelphi SQLite 插入主键为自动增量的表中
【发布时间】: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)

  1. 然后我尝试用 AUTOINCREMENT 替换 AUTOINC,但在 AUTOINCREMENT 附近创建表时出现语法错误,因此我认为 ZEOS 不支持声明 AUTOINCREMENT ?!?!

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

    id int(11) 主键,

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

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

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

【问题讨论】:

  • 我认为你想要id INTEGER PRIMARY KEY 通常建议不要使用AUTOINCREMENT(除非确实需要),因为它涉及将“曾经使用过的最大值”保留在表格中,这(稍微)会减慢速度.
  • 显然我应该在声明 id 字段时使用 INTEGER 而不是 INT。我将再进行一些测试,然后回到这里......
  • SQLite 接受许多关于如何定义字段的变体(尽可能与其他 SQL 方言“不兼容”),但很多时候它们几乎无关紧要,因为任何字段都可以保存值任何类型。少数例外之一是 PRIMARY KEY 字段具有您想要的自动生成行为,它需要应用于 INTEGER 而不是任何类似的变体。
  • 是的,那是我的问题。关键字错误。

标签: sqlite delphi-xe zeos


【解决方案1】:

Some other part of the documentation 说:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2012-02-22
    • 2012-01-21
    • 2013-04-18
    相关资源
    最近更新 更多