如果文件名列不是唯一的,则可以在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))