我想创建一个整数主键限制在 000 到 999 之间的表。有没有办法在 sql 中强制执行这个 3 位限制?
我正在使用 sqlite3。谢谢。
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
以防止人们更改超出范围的值。基本上,CHECK
如果您使用 SQLite 3.3 或更高版本,则该约束更可取。
注意:我没有测试上面的代码。
jmisso, I would not recommend reusing primary keys that have been deleted. You can create data integrity problems that way if all other tables that might have that key in them were not deleted first (one reason to always enforce setting up foreign key relationships in a database to prevent orphaned data like this). Do not do this unless you are positive that you have no orphaned data that might get attached to the new record.
Why would you even want to limit the primary key to 1000 possible values? What happens when you need 1500 records in the table? This doesn't strike me as a very good thing to even be trying to do.
您可以使用 CHECK 约束来执行此操作。
但,
从 3.3.0 版开始支持 CHECK 约束。在 3.3.0 版之前,CHECK 约束已被解析但未强制执行。
(从这里)
所以除非 SQLite 3 = SQLite 3.3 这可能行不通
如何在开始时使用 1000 行预先填充表。使用某种 1/0 列(如 Is_Available 或类似列)切换可用行。然后不允许插入或删除,只允许更新。在这种情况下,您的应用程序只需针对更新进行编码。