违反唯一约束的行

Fin*_*cer 3 database postgresql constraints unique-constraint

我有一个postgres 8.3.4数据库.存在名称表,其对三元组UNIQ(名称,id,年龄)具有唯一约束.不知何故,有几行已添加到数据库中,导致违反此约束.

我的问题是这怎么可能?当添加违反约束的第一行时,数据库是否应该抛出错误?

name:text
id:integer not null(fk to id table)
age:integer

Qua*_*noi 5

这几乎是不可能的。

最有可能的是,您的名称中有多余的空格或类似的内容。

请发布确切的表定义。

另外,请运行此查询:

SELECT  q2.*
FROM    (
        SELECT  name, id, age
        FROM    mytable
        GROUP BY
                name, id, age
        HAVING  COUNT(*) > 1
        ) q
JOIN    mytable q2
ON      (q2.name, q2.id, q2.age) IS NOT DISTINCT FROM (q.name, q.id, q.age)
Run Code Online (Sandbox Code Playgroud)

并在此处发布一些返回的输出。


Erw*_*ter 5

我的猜测是你错过了NULL永远不会UNIQUE有价值的事实.
如果输入(NULL, 1, 20)(name, id, age)多次,你没有违反独特.两个NULL值永远不会被认为是"相同的".

您可以设置所有涉及的列NOT NULL(在用虚拟值替换NULL值之后).

或者,您可以实现其他部分索引以覆盖NULL(在清除"dupes"之后NULL).例如,如果您需要覆盖name列的NULL:

CREATE UNIQUE INDEX tbl_id_age_name_null_idx ON my_table (id, age)
WHERE name IS NULL;
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的表中为(名字,身份,年龄)拥有('pete',1,20)和('jane',1,20)和(NULL,1,20),但这些都不是第二次.我最近在dba.SE上为这个案例了一个更详细的评估.

顺便说一句:你应该考虑更新你的PostgreSQL版本.优选地,当前版本为9.1.或至少到最新的点发布8.3.18.已经有很多修复.