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 <>);