【发布时间】:2010-09-19 16:26:11
【问题描述】:
我想创建一个整数主键限制在 000 到 999 之间的表。有没有办法在 sql 中强制执行这个 3 位限制?
我正在使用 sqlite3。 谢谢。
【问题讨论】:
我想创建一个整数主键限制在 000 到 999 之间的表。有没有办法在 sql 中强制执行这个 3 位限制?
我正在使用 sqlite3。 谢谢。
【问题讨论】:
您可以使用 CHECK 约束来做到这一点。
但是,
从 3.3.0 版开始支持 CHECK 约束。在 3.3.0 版本之前,CHECK 约束已被解析但未强制执行。
(来自here)
所以除非 SQLite 3 = SQLite 3.3,否则这可能行不通
【讨论】:
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 约束更可取。
注意:上面的代码我没有测试过。
【讨论】:
jmisso,我不建议重复使用已删除的主键。如果没有首先删除所有其他可能包含该键的表,则可以通过这种方式创建数据完整性问题(始终强制在数据库中设置外键关系以防止此类孤立数据的原因之一)。除非您确定没有可能附加到新记录的孤立数据,否则请勿执行此操作。
您为什么要将主键限制为 1000 个可能的值?当表中需要 1500 条记录时会发生什么?这在我看来并不是一件好事,甚至尝试去做。
【讨论】:
如何在开始时使用 1000 行预先填充表。使用某种 1/0 列(如 Is_Available 或类似列)切换可用行。然后不允许插入或删除,只允许更新。在这种情况下,您的应用程序只需针对更新进行编码。
【讨论】: