【问题标题】:Any way to enforce numeric primary key size limit in sql?有什么方法可以在 sql 中强制执行数字主键大小限制?
【发布时间】:2010-09-19 16:26:11
【问题描述】:

我想创建一个整数主键限制在 000 到 999 之间的表。有没有办法在 sql 中强制执行这个 3 位限制?

我正在使用 sqlite3。 谢谢。

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    您可以使用 CHECK 约束来做到这一点。

    但是,

    从 3.3.0 版开始支持 CHECK 约束。在 3.3.0 版本之前,CHECK 约束已被解析但未强制执行。

    (来自here

    所以除非 SQLite 3 = SQLite 3.3,否则这可能行不通

    【讨论】:

      【解决方案2】:

      SQLite 支持两种方式:

      在主键列上定义CHECK 约束:

      CREATE TABLE mytable (
        mytable_id INT PRIMARY KEY CHECK (mytable_id BETWEEN 0 and 999)
      );
      

      在表上创建一个触发器,以中止任何试图将主键列设置为您不想要的值的INSERTUPDATE

      CREATE TRIGGER mytable_pk_enforcement
      BEFORE INSERT ON mytable
      FOR EACH ROW 
        WHEN mytable_id NOT BETWEEN 0 AND 999
      BEGIN
        RAISE(ABORT, 'primary key out of range');
      END
      

      如果您使用自动分配的主键,如上所示,您可能需要运行触发器 AFTER INSERT 而不是在插入之前运行。在BEFORE 触发器执行时,可能还没有生成主键值。

      您可能还需要在UPDATE 上编写触发器,以防止人们更改超出范围的值。基本上,如果您使用 SQLite 3.3 或更高版本,CHECK 约束更可取。

      注意:上面的代码我没有测试过。

      【讨论】:

      • 确实使用 CHECK 约束,它不会允许超出该范围的数字,但这并不像我想要的那样工作(很抱歉我没有提到),因为我想要它在尝试第 1000 个键后使用第一个可用的主键(由已删除的行释放)。感谢您的回答,我将研究 TRIGGER 选项。
      【解决方案3】:

      jmisso,我不建议重复使用已删除的主键。如果没有首先删除所有其他可能包含该键的表,则可以通过这种方式创建数据完整性问题(始终强制在数据库中设置外键关系以防止此类孤立数据的原因之一)。除非您确定没有可能附加到新记录的孤立数据,否则请勿执行此操作。

      您为什么要将主键限制为 1000 个可能的值?当表中需要 1500 条记录时会发生什么?这在我看来并不是一件好事,甚至尝试去做。

      【讨论】:

      • 是的,如果有人来寻找 id #200,它已被删除并重新分配给其他实体怎么办?重复使用主键值充满危险。
      • 正是比尔。使用旧文书工作的人经常这样做。此外,您通常出于法律原因不想仅仅因为客户或员工或任何不再活跃的东西而删除旧数据。
      【解决方案4】:

      如何在开始时使用 1000 行预先填充表。使用某种 1/0 列(如 Is_Available 或类似列)切换可用行。然后不允许插入或删除,只允许更新。在这种情况下,您的应用程序只需针对更新进行编码。

      【讨论】:

        猜你喜欢
        • 2011-01-30
        • 2011-07-29
        • 2015-04-20
        • 1970-01-01
        • 1970-01-01
        • 2022-07-18
        • 2013-07-18
        • 1970-01-01
        • 2019-09-02
        相关资源
        最近更新 更多