gpt4 book ai didi

sql - Postgres 跨表唯一组合约束

转载 作者:行者123 更新时间:2023-11-29 12:37:37 25 4
gpt4 key购买 nike

我有三个表-

file (
file_id int primary key
filename text not null
etc...
)
product (
product_id int primary key
etc....
)
product_attachment (
product_id references product
file_id references file
)

我想确保当这些是自然连接时,product_id + filename 是唯一的。到目前为止,我的最佳解决方案是将文件名添加到 product_attachment 表,但我想知道是否有办法避免这种情况。

最佳答案

如果文件名列不唯一,您可以在 product_attachment 表上添加自定义约束。请注意,这将在每次插入和更新时执行下面的查询,这在性能方面并不理想。

CREATE OR REPLACE FUNCTION check_filename(product_id integer, file_id integer)
RETURNS boolean AS
$$
LOCK product_attachment IN SHARE MODE;
SELECT (COUNT(*) = 0)
FROM product_attachment pa
JOIN file f1 ON f1.file_id = pa.file_id
JOIN file f2 ON f1.filename = f2.filename
WHERE pa.product_id = $1 AND f2.file_id = $2
$$
LANGUAGE 'plpgsql'

ALTER TABLE product_attachment
ADD CONSTRAINT check_filename CHECK
(check_filename(product_id, file_id))

关于sql - Postgres 跨表唯一组合约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24910113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com