首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >违反唯一约束的行

违反唯一约束的行
EN

Stack Overflow用户
提问于 2012-04-22 16:57:50
回答 2查看 2.2K关注 0票数 3

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

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

名称:文本

id : integer not null (到id表的fk)

年龄:整数

EN

回答 2

Stack Overflow用户

发布于 2012-04-22 23:06:29

我的猜测是,您忽略了这样一个事实,即NULL UNIQUE.

如果您为(name, id, age)多次输入(NULL, 1, 20),则不会得到唯一冲突。两个NULL值永远不会被认为是“相同的”。

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

或者,您可以实现来覆盖NULL(在使用NULL清除“副本”之后)。例如,如果您需要覆盖NULL的name列:

代码语言:javascript
复制
CREATE UNIQUE INDEX tbl_id_age_name_null_idx ON my_table (id, age)
WHERE name IS NULL;

然后,您可以在表中使用('pete',1,20)和('jane',1,20)和(NULL,1,20) for (name,id,age),但这些都不是第二次。我最近写了a more detailed assessment for this case on dba.SE

顺便说一句:你应该考虑更新你的version of PostgreSQL。优选到当前版本9.1。或者至少到最新版本8.3.18。已经有了许多修复。

票数 5
EN

Stack Overflow用户

发布于 2012-04-22 17:03:41

这几乎是不可行的。

最有可能的是,名称中有额外的空格或类似这样的内容。

请张贴确切的表定义。

另外,请运行以下查询:

代码语言:javascript
复制
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)

并在这里发布一些返回的输出。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10266593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档