Database 违反唯一约束的行

Database 违反唯一约束的行,database,postgresql,constraints,unique-constraint,Database,Postgresql,Constraints,Unique Constraint,我有一个postgres 8.3.4数据库。名称表在三元组UNIQ(名称、id、年龄)上具有唯一约束。不知何故,数据库中添加了几行,导致违反此约束 我的问题是这怎么可能?当添加违反约束的第一行时,数据库不应该抛出错误吗 名称:文本 id:整数不为空(fk到id表) 年龄:整数这几乎不可行 最可能的情况是,在名称或类似的内容中有额外的空格 请发布准确的表格定义 另外,请运行此查询: SELECT q2.* FROM ( SELECT name, id, age

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

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

名称:文本
id:整数不为空(fk到id表)
年龄:整数这几乎不可行

最可能的情况是,在名称或类似的内容中有额外的空格

请发布准确的表格定义

另外,请运行此查询:

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)

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

我的猜测是您忽略了
NULL
值从来都不是唯一的

如果多次为
(姓名、id、年龄)
输入
(NULL、1、20)
,则不会得到唯一的违规。两个
NULL
值从未被视为“相同”

您可以将所有涉及的列设置为非空(将空值替换为伪值后)

或者您可以实现覆盖空值(使用
NULL
清除“重复项”后)。例如,如果需要为空值覆盖
name
列:

CREATE UNIQUE INDEX tbl_id_age_name_null_idx ON my_table (id, age)
WHERE name IS NULL;
然后,您可以在表中为(姓名、id、年龄)添加('pete',1,20)和('jane',1,20)以及('NULL,1,20),但这些都不会再次出现。我最近写了一封信


BTW:你应该考虑更新你的。最好是当前版本9.1。或至少更新至最新版本8.3.18。已经有很多修复程序。

PostgreSQL 8.3不再受支持。如果由于某些奇怪的原因无法更新到当前版本(9.x),则至少应更新到最新的8.3版本,即8.3.18。是否确定名称相同?是否控制了尾随空白?而且,正如许多人已经评论的那样,您最好升级到当前版本的PostgreSQL:所有三列都使用NOTNULL保护constraint@Finslicer:您可能想要编辑您的问题。这里的信息并不反映您在这里的评论。