Bạn có thể sử dụng ràng buộc KIỂM TRA cho việc này. Bạn không thể đặt một truy vấn trong ràng buộc KIỂM TRA nhưng bạn có thể gọi một hàm; vì vậy, chúng tôi xây dựng một hàm đơn giản cho chúng tôi biết nếu một pluginid
là một ma trận:
create or replace function is_matrix(int) returns boolean as $$
select exists (
select 1
from plugins
where id = $1
and type = 'matrix'
);
$$ language sql;
và bọc điều đó trong ràng buộc KIỂM TRA:
alter table matrix_params add constraint chk_is_matrix check (is_matrix(pluginid));
Sau đó:
=> insert into matrix_params values (1,1);
=> insert into matrix_params values (2,3);
ERROR: new row for relation "matrix_params" violates check constraint "chk_is_matrix"
Và FK quan tâm đến tính toàn vẹn của tham chiếu và các tầng.