【问题标题】:sqlite3 - Generating a unique ID based on existing fieldssqlite3 - 根据现有字段生成唯一 ID
【发布时间】:2012-08-23 23:59:14
【问题描述】:

我有一个创建表、设置触发器[1] 和插入数据的 sql 脚本。在构建我的应用程序期间,通过 sqlite 命令行使用 sql 来创建数据库。基本上我有一个表,其行必须基于三个字段是唯一的。我想根据三个字段自动生成散列或某种形式的唯一 ID 以用作主键。我的理解是 sqlite 没有内置的散列函数。是否有其他方法可以根据插入前触发器中三个字段的内容生成唯一键?

[1] This isn't happening yet as I don't know how to generate a unique key

表格看起来像这样。我可以使用 3 个字段(firstName、lastName、birthYear)的主键,但是我必须在每个表中使用所有三个字段,我想在其中有一个外键。这 3 个字段是字符串,我想它会是更多的空间,会减慢速度。

create table (
  firstName VARCHAR,
  lastName  VARCHAR,
  birthYear CHAR(4)
  ... more fields ...
);

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    在大多数情况下,您最好使用一个自动递增的整数列作为主键。然后对自然键进行建模,添加UNIQUE 约束:

    CREATE TABLE t1(
      id INTEGER PRIMARY KEY,
      firstName VARCHAR,
      lastName  VARCHAR,
      birthYear CHAR(4)
      UNIQUE (firstName, lastName, birthYear)
    );
    

    这样,您可以将id 的值用作其他表的外键,而UNIQUE 约束可以防止您拥有具有相同自然键的重复记录。

    【讨论】:

    • 这可以保持字段的唯一性,它给了我一个可以使用的 ID,但该 ID 不是基于有问题的 3 个字段。例如,如果我创建了我的数据库,然后稍后再回来添加更多数据并重新生成我的数据库,则每次运行的 ID 可能不同。
    • 我不确定我是否完全理解。所以你的意思是你需要ID是可重现的?你会用它们做什么?我对触发器不是很熟悉,但至少对于外键问题,上述解决方案就足够了。
    • 是的,我希望它们是可重现的。我创建了一个数据库以在我的应用程序中发送,但我需要能够在应用程序更新期间将其与用户本地缓存同步。我需要确保按键不会发生冲突。
    【解决方案2】:

    从这三列创建主键还不够吗?

    create table test(a int, b int, c int, primary key(a,b,c));
    

    【讨论】:

    • ChrisB,我可以看到我的编辑为什么我不喜欢这种方法。
    • 听起来你正在从sqlite外部的脚本构建这个数据库。如果是这样,如何使用不同的命令行程序(如 md5sum)生成哈希?然后,只需将其作为普通主键传递给 sqlite
    猜你喜欢
    • 2020-06-09
    • 2011-12-24
    • 2019-03-08
    • 2013-05-22
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多