我有三张桌子-
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
+文件名是唯一的。到目前为止,我拥有的最佳解决方案是将文件名添加到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))
当我试图创建第二个表时,我遇到了以下错误,但我不知道为什么。对于表patente,我希望能够将(idfunconario,titulo)作为主键。正如其他主题中所建议的,我已经尝试将唯一约束设置为“唯一(IDFunconario,titulo)”。 消息错误: 错误:没有唯一的约束匹配引用表"public acao"的给定键SQL状态:42830 我在64位的Windows 8.1上使用Postg
问题内容: 我一直在尝试找出是否有可能对两列的组合具有唯一约束。 具体来说,我有两列A和B。 我有下面这样的行 然后我希望以下组合在插入时失败 我尝试添加一个简单的约束 但这让我在已经存在时插入。 这可能吗?还是在插入之前必须检查组合是否存在? 问题答案: 您可以使用表达式的索引来执行此操作: 我不认为约束允许表达式(并且现在没有方便的Postgres进行测试),但这本质上是同一回事。
问题内容: 我在Postgres DB中有两个名为&的表,如下所示: 如何确保仅将或的唯一组合用于主键,以便表不允许插入以下内容: 如果已经有包含like的行: 目的是避免相同玩家之间的比赛进入。 问题答案: 创建一个唯一索引: 不能是或约束,因为它们仅适用于列,不适用于表达式。 您可以添加一个列作为PK,但是只有两个整数列,原始PK也非常有效(请参阅注释)。它会自动使两列都变为。(否则,添加约束
问题内容: 给定Postgres数据库中的以下三列:第一,第二,第三;我如何创建一个约束使得排列是唯一的? 例如,如果数据库中存在,则将其作为非唯一变量排除在外。 问题答案: 您可以使用hstore创建唯一索引: 更新 实际上
我有一张桌子,不知怎的,同一个人进了我的桌子两次。现在,主键只是一个自动编号,但还有两个字段存在,我想强制它们是唯一的。 例如,这些字段是: 我只想要一张带有唯一PersonNumber和Active=1的唱片 (因此这两个字段的组合必须是唯一的) SQL server中现有表的最佳方式是什么?我可以这样做,如果其他任何人使用与现有值相同的值进行插入,则插入失败,因此我不必在应用程序代码中担心这一
如何实现数据库中没有两个相同的记录,而这三列的值组合在一起是相同的?