我想创建一个表,其整数主键限制在000和999之间。有没有办法在sql中强制执行这个3位数的限制?
我正在使用sqlite3。 感谢。
答案 0 :(得分:2)
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
触发器执行时,可能尚未生成主键值。
您可能还需要在UPDATE
上编写触发器,以防止人们更改范围之外的值。基本上,如果您使用SQLite 3.3或更高版本,则CHECK
约束是首选。
注意:我还没有测试过上面的代码。
答案 1 :(得分:1)
您可以使用CHECK约束来执行此操作。
但是,
从版本3.3.0开始支持CHECK约束。在版本3.3.0之前,已解析CHECK约束但未强制执行。
(来自here)
因此,除非SQLite 3 = SQLite 3.3,否则这可能无法正常工作
答案 2 :(得分:1)
jmisso,我不建议重复使用已删除的主键。如果不首先删除其中可能包含该键的所有其他表,则可以创建数据完整性问题(一个原因是始终强制在数据库中设置外键关系以防止像这样的孤立数据)。除非您肯定没有可能附加到新记录的孤立数据,否则不要这样做。
为什么您甚至想将主键限制为1000个可能的值?当你需要表中的1500条记录时会发生什么?这对我来说并不是一件非常好的事情。甚至可以尝试这样做。
答案 3 :(得分:0)
确实使用CHECK约束它不会允许超出该范围的数字,但这并不像我想的那样完全正常工作(我很抱歉我没有提到),因为我希望它能够使用第一个尝试第1000个密钥后,可用主键(由已删除的行释放)。
感谢您的回答,我将查看TRIGGER选项。
答案 4 :(得分:0)
答案 5 :(得分:0)
为什么是整数?你说它介于000和999之间,所以听起来你实际上并没有对整数进行数学运算。
如果你不是在做算术,你应该使用字符。
答案 6 :(得分:0)
如何在开始时使用1000行预先填充表格。使用某种1/0列(如Is_Available或类似列)切换可用行。然后不允许插入或删除,只允许更新。在这种情况下,您的应用只需要编码更新。