有没有办法在sql中强制执行数字主键大小限制?
我想创建一个表,它的整数主键限制在000和999之间。有没有办法在sql中强制执行此3位数限制 我正在使用sqlite3。有没有办法在sql中强制执行数字主键大小限制?,sql,database,sqlite,Sql,Database,Sqlite,我想创建一个表,它的整数主键限制在000和999之间。有没有办法在sql中强制执行此3位数限制 我正在使用sqlite3。 谢谢。您可以使用检查约束来执行此操作 但是, 自版本3.3.0起,支持检查约束。在版本3.3.0之前,已解析但未强制执行检查约束 (来自) 因此,除非SQLite 3=SQLite 3.3,否则这可能不起作用您可以使用检查约束来执行此操作 但是, 自版本3.3.0起,支持检查约束。在版本3.3.0之前,已解析但未强制执行检查约束 (来自) 因此,除非SQLite 3=SQL
谢谢。您可以使用检查约束来执行此操作 但是, 自版本3.3.0起,支持检查约束。在版本3.3.0之前,已解析但未强制执行检查约束 (来自)
因此,除非SQLite 3=SQLite 3.3,否则这可能不起作用您可以使用检查约束来执行此操作 但是, 自版本3.3.0起,支持检查约束。在版本3.3.0之前,已解析但未强制执行检查约束 (来自)
因此,除非SQLite 3=SQLite 3.3,否则这可能不起作用。SQLite支持两种方法: 在主键列上定义
检查约束:
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
如上图所示,如果使用自动分配的主键,则可能需要在插入后而不是插入前运行触发器。在执行
触发器之前的时,可能尚未生成主键值
您可能还需要在UPDATE
上写入触发器,以防止人们更改超出范围的值。基本上,如果使用SQLite 3.3或更高版本,最好使用CHECK
约束
注意:我没有测试上面的代码。SQLite支持两种方法:
在主键列上定义检查约束:
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
如上图所示,如果使用自动分配的主键,则可能需要在插入后而不是插入前运行触发器。在执行
触发器之前的时,可能尚未生成主键值
您可能还需要在UPDATE
上写入触发器,以防止人们更改超出范围的值。基本上,如果使用SQLite 3.3或更高版本,最好使用CHECK
约束
注意:我没有测试上面的代码。jmisso,我不建议重用已删除的主键。如果没有首先删除可能包含该键的所有其他表,则可以通过这种方式创建数据完整性问题(这是始终强制在数据库中设置外键关系以防止像这样的孤立数据的一个原因)。除非确定没有可能附加到新记录的孤立数据,否则不要执行此操作
为什么要将主键限制为1000个可能的值?当表中需要1500条记录时会发生什么情况?这对我来说并不是一件很好的事情。jmisso,我不建议重用已经删除的主键。如果没有首先删除可能包含该键的所有其他表,则可以通过这种方式创建数据完整性问题(这是始终强制在数据库中设置外键关系以防止像这样的孤立数据的一个原因)。除非确定没有可能附加到新记录的孤立数据,否则不要执行此操作
为什么要将主键限制为1000个可能的值?当表中需要1500条记录时会发生什么情况?这对我来说都不是一件好事。在表的开头预先填充1000行怎么样。使用某种类型的1/0列(如Is_available或类似)切换可用行。然后不允许插入或删除,只允许更新。在这种情况下,您的应用程序只需编码以进行更新 在表的开头预先填充1000行怎么样。使用某种类型的1/0列(如Is_available或类似)切换可用行。然后不允许插入或删除,只允许更新。在这种情况下,您的应用程序只需编码以进行更新 是的,如果有人来找id#200,该怎么办?该id已被删除并重新分配给其他实体?重复使用主键值充满了危险。正是比尔。从旧文件工作的人经常这样做。此外,您不想仅仅因为客户或员工或其他任何人不再活跃而删除旧数据通常有法律原因。是的,如果有人来寻找id#200,该id已被删除并重新分配给其他实体,又该怎么办?重复使用主键值充满了危险。正是比尔。从旧文件工作的人经常这样做。此外,您不想仅仅因为客户或员工或其他任何人不再活动而删除旧数据,通常有法律原因。实际上,使用检查约束,它不允许超出该范围的数字,但这与我想要的不完全一样(很抱歉,我没有提到这一点),因为我希望它在尝试第1000个键之后使用第一个可用的主键(由删除的行释放)。感谢您的回答,我将研究触发器选项。实际上,使用检查约束,它将不允许超出该范围的数字,但这并不完全符合我的要求(很抱歉,我没有提到这一点),因为我希望它在尝试第1000个键后使用第一个可用的主键(由删除的行释放)。谢谢你的回答,我会研究一下触发选项。