代码之家  ›  专栏  ›  技术社区  ›  jmissao

有没有办法在sql中强制执行数字主键大小限制?

  •  1
  • jmissao  · 技术社区  · 17 年前

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

    我正在使用sqlite3。 谢谢。

    7 回复  |  直到 17 年前
        1
  •  2
  •   Bill Karwin    17 年前

    SQLite支持两种方法:

    定义 CHECK 主键列上的约束:

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

    在表上创建一个触发器,终止任何 INSERT UPDATE 试图将主键列设置为不需要的值。

    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 触发器执行。

    您可能还需要在 更新 以防止人们更改超出范围的值。基本上 支票 如果使用SQLite 3.3或更高版本,则最好使用约束。

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

        2
  •  1
  •   AlexCuse    17 年前

    您可以使用CHECK约束来执行此操作。

    但是,

    从3.3.0版起支持检查约束。在版本3.3.0之前,已分析检查约束,但未强制执行。

    (来自 here )

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

        3
  •  1
  •   HLGEM    17 年前

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

    为什么要将主键限制为1000个可能的值?当您需要表中的1500条记录时会发生什么情况?我觉得这不是一件很好的事情。

        4
  •  0
  •   jmissao    17 年前

    实际上,使用CHECK约束时,它不允许超出该范围的数字,但这并不像我所希望的那样工作(很抱歉,我没有提到这一点),因为我希望它在尝试第1000个键后使用第一个可用的主键(由删除的行释放)。

    谢谢你的回答,我会调查触发选项。

        5
  •  0
  •   jmissao    17 年前

    赫格姆,你可能是对的。我试着去执行它,因为那个密钥是一个更大的7位数代码的一部分,我不能让它变大。可能这张桌子几年内甚至达不到500行,因为它是为一家小商店准备的。希望在那之前,他们能买得起rfid。

        6
  •  0
  •   Andy Lester    17 年前

    为什么是整数?你说它在000到999之间,所以听起来你并不是在对整数做数学运算。

    如果不是你在做算术,你应该使用字符。

        7
  •  0
  •   Eric Sabine    17 年前

    在表的开头预先填充1000行怎么样。使用某种1/0列(如“可用”或类似列)切换可用行。然后不允许插入或删除,只允许更新。在这种情况下,你的应用程序只需编码更新。