使用查询检查约束



我试图使用一行检查约束,而我只有私钥。我不知道是否有另一种方法来检查这种东西,我对SQL相当陌生,所以我也愿意接受建议。

下面是一个简单的例子:

我有以下表格:

Buildings:
building_id: int GENERATED PRIMARY KEY
Floors:
floor_id: int GENERATED PRIMARY KEY
floor_nr: int
building_id: int FOREIGN KEY REFERENCES Buildings (building_id)
Glasses:
glass_id: int GENERATED PRIMARY KEY
building_id: int FOREIGN KEY REFERENCES Buildings (building_id)
Floors_Glasses:
floor_id: int FOREIGN KEY REFERENCES Floors (floor_id)
glass_id: int FOREIGN KEY REFERENCES Glasses (building_id)

当我想把玻璃杯移到地板上时,我需要检查是否

(SELECT building_id FROM Floors WHERE floor_id = floor.floor_id) == glass.building_id

所以我不必为我写的每个查询重复上面的查询。

编辑:

我最终使用约束触发器如下:
CREATE CONSTRAINT TRIGGER "trigger name"
AFTER UPDATE OF "column name" ON "table name"
FOR EACH ROW EXECUTE PROCEDURE "procedure name"

并引发异常

raise exception 'message' using errcode = 'restrict_violation';

你总是可以在应用级别强制执行此规则。然而,我总是不信任这些应用程序(因为它们总是充满了错误),所以我个人更倾向于在数据库级别执行规则,只要可能。

这是一个多一点的启动工作,但为您节省了很多时间,因为它可以防止数据损坏问题从一开始。

你可以这样做:

create table buildings (
building_id int primary key not null
);
create table floors (
building_id int not null references buildings (building_id),
floor_id int not null,
floor_nr int,
primary key (building_id, floor_id)
);
create table glasses (
building_id int not null references buildings (building_id),
glass_id int not null,
glass_price int,
primary key (building_id, glass_id)
);
create table floor_glasses (
building_id int not null,
floor_id int not null,
glass_id int not null,
primary key (building_id, floor_id, glass_id),
foreign key (building_id, floor_id) references floors (building_id, floor_id),
foreign key (building_id, glass_id) references glasses (building_id, glass_id)
);

关键概念在最后一个表中。只有一个两个中使用的列building_id外键引用。这个引用共享确保最后一张表中引用的楼层和玻璃始终属于同一建筑物。

如果一个玻璃确实可以同时在多个楼层,将building_id添加到floors_glasses,并从该表创建到floorsglasses的复合外键,其中包括building_id列。这将保证您的完整性约束。

不能定义引用其他行或表的检查约束,因为一旦修改了其他对象,检查约束就会失效。例如,恢复转储文件可能会失败。

最新更新