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
这几乎是不可能的。
最有可能的是,您的名称中有多余的空格或类似的内容。
请发布确切的表定义。
另外,请运行此查询:
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)
并在此处发布一些返回的输出。
我的猜测是你错过了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.已经有很多修复.
| 归档时间: |
|
| 查看次数: |
1735 次 |
| 最近记录: |