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 如何基于postgres中的其他列限制某些列的插入值_Postgresql_Constraints - Fatal编程技术网

Postgresql 如何基于postgres中的其他列限制某些列的插入值

Postgresql 如何基于postgres中的其他列限制某些列的插入值,postgresql,constraints,Postgresql,Constraints,我这里有一个表,我想确保某些插入被阻止 CREATE TABLE Creature ( species TEXT, name TEXT, arms INTEGER, legs INTEGER ); 当插入此表时,每个物种的手臂和腿的数量应与具有相同物种的任何其他条目相同 INSERT INTO Creatures VALUES ('Human', 'John', 2, 2); INSERT INTO Creatures VALUES ('Human', 'Steve', 2,

我这里有一个表,我想确保某些插入被阻止

CREATE TABLE Creature (
  species TEXT,
  name TEXT,
  arms INTEGER,
  legs INTEGER
);
当插入此表时,每个物种的手臂和腿的数量应与具有相同物种的任何其他条目相同

INSERT INTO Creatures VALUES ('Human', 'John', 2, 2);
INSERT INTO Creatures VALUES ('Human', 'Steve', 2, 2);
INSERT INTO Creatures VALUES ('Human', 'Mark', 0, 4); -- should not work as humans have 2 arms and 2 legs

我尝试过使用检查约束,但我不确定如何检查现有表的值(如果它们已经存在)。

规范化。首先创建另一个表
species
,在其中存储每个物种的手臂和腿部数量

然后只有一个外键引用
生物
中的物种

CREATE TABLE creature
             (id serial,
              species integer,
              name text,
              PRIMARY KEY (id),
              FOREIGN KEY (species)
                          REFERENCES species
                                     (id));

虽然出于不止一个原因,这看起来是一个相当糟糕的设计,但您仍然可以这样做。您将使用排除约束

create extension btree_gist;

alter table creature add constraint consistent_limbs 
    exclude using gist (species with =, arms with <>, legs with <>);
创建扩展树;
改变桌子生物添加约束一致的肢体
排除使用gist(带=、带手臂、带腿的物种);

这是不可持续的。如果有人插入了第一个“山羊”并意外指定了5条腿怎么办?这是否意味着所有的山羊都必须有5条腿?最好在表定义中有固定的约束。我知道。这是学校的作业,所以计划得不太好。有什么方法可以实现这样的事情吗?下面的答案是正确的处理方法。您的桌子不是第三标准形状。无法使插入条件基于现有行。您可以编写SQL函数来执行所有插入并在其中执行检查,但这不会阻止恶意插入。
create extension btree_gist;

alter table creature add constraint consistent_limbs 
    exclude using gist (species with =, arms with <>, legs with <>);