Postgresql 如何创建约束以确保列具有连续值
我有这个模型的照片:Postgresql 如何创建约束以确保列具有连续值,postgresql,constraints,Postgresql,Constraints,我有这个模型的照片: CREATE TABLE photo ( id serial PRIMARY KEY, name text NOT NULL, ordinal smallint NOT NULL CHECK (ordinal > 0), album integer NOT NULL, UNIQUE(name, ordinal, album) DEFERRABLE INITIALLY IMMEDIATE ) 和一些样本数据 id name
CREATE TABLE photo (
id serial PRIMARY KEY,
name text NOT NULL,
ordinal smallint NOT NULL CHECK (ordinal > 0),
album integer NOT NULL,
UNIQUE(name, ordinal, album) DEFERRABLE INITIALLY IMMEDIATE
)
和一些样本数据
id name ordinal album
1 a.jpg 1 1
2 b.jpg 2 1
3 c.jpg 1 2
4 d.jpg 2 2
相册中包含照片的位置。在每个相册中,都会订购照片
我想创建一个约束,确保ordinal
列始终具有连续值。比如说,
id name ordinal album
5 e.jpg 4 1
应被拒绝,因为相册1中没有序号为3的照片
请注意,我将唯一约束设置为可延迟,因为我希望允许对相册中的照片进行重新排序
我想让连续延迟也可以,因为我可能会插入多张照片,所以只要插入发生在同一事务中,插入一张序号为4的照片,然后再插入序号为3的照片就不会触发错误
我应该如何编写此约束
我试图定义一个返回布尔值的函数,并在检查约束中使用该函数,希望查询表以检查相册中的序号是否与当前行中的序号相同(使用SQL)。但来自postgresql的参考称
当前,检查表达式不能包含子查询,也不能引用
当前行的列以外的变量
所以这似乎是一条死胡同,我不知道如何继续
有什么想法吗?您可以使用触发器函数,该函数将在事务提交期间执行 请看这里: 根据表中的行数,建议实际使用两个触发器: