Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何创建约束以确保列具有连续值_Postgresql_Constraints - Fatal编程技术网

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的参考称

当前,检查表达式不能包含子查询,也不能引用 当前行的列以外的变量

所以这似乎是一条死胡同,我不知道如何继续


有什么想法吗?

您可以使用触发器函数,该函数将在事务提交期间执行

请看这里:

根据表中的行数,建议实际使用两个触发器:

  • 一种基于行的常规触发器,用于将被触摸记录的ID写入临时表
  • 在临时表的帮助下,一次检查所有更新记录的延迟提交触发器。触发器仍将为每个更新的记录调用一次,因此您还应该记录检查是否已运行