Firebird2.5 错误:“唯一索引中的重复值”没有重复数据

Posted

技术标签:

【中文标题】Firebird2.5 错误:“唯一索引中的重复值”没有重复数据【英文标题】:Firebird2.5 Error: "duplicate value in unique index" without duplicate data 【发布时间】:2014-02-19 12:21:58 【问题描述】:

您好,感谢您的阅读,也可能对我有所帮助

我的问题的简要说明:

我正在将数据从一个 Firebird 数据库复制到另一个(称为 V14),并且我正在使用 IBExpert 来执行此操作。 这些表的名称相同并且具有相同的结构。为了便于解释,我将调用包含旧数据库 A 中数据的表,而我要插入数据的表应称为 B。

所以唯一要做的就是从表 A 中取出所有数据并将它们插入到表 B 中。 这样做的一小段代码是:

INSERT into [V14].BSMZ SELECT * FROM BSMZ

执行此操作我收到错误消息(在传输了一些行之后):

插入或更新值无效:对象列受到限制 - 没有 2 个表行可以有重复的列值。尝试在唯一索引“UI_BSMZ”中存储重复值(对活动事务可见)

此唯一索引包含 2 个数据列,适用于表 B 和 A。

有多个行会导致此问题,但也会根据需要传输多个行。 我已经证明,无法插入到表 B 中的行在其唯一键列中具有值,而这些值在表 B 中并不存在。

(出于测试目的,我确实从表 B 中删除了约束。但我仍然收到相同的错误消息,这让我更加困惑)

我不太确定是什么导致了这个问题,希望能得到一些提示。

【问题讨论】:

在某些情况下,可能会出现支持唯一约束的损坏索引。还要检查其中一个受约束的列中是否没有空值。 受约束的列中没有空值。也许我应该问谷歌如何修复损坏的索引并看看这是否解决了问题...... 另一件事:约束是否包括 (var)char 列?如果是这样,它可能是一个不区分大小写和/或不区分重音排序规则的列吗? 它包含一个整数和一个 VarChar(6) 列。但是 VarChar 仅用于存储数字。 (不要问我为什么,我没有设计它 - 我只是不得不应付它^^) 【参考方案1】:

你得到了准确的错误信息唯一索引“UI_BSMZ” 找到这个唯一约束的声明——它不是关于从 B 到 A 的外键 这是表中某些字段[s]的约束

在源数据库中对此 UK UI_BSMZ 的字段运行查询

SELECT UK_FIELD_1, UK_FIELD_2, .. FROM TABLE_NAME GROUP BY UK_FIELD_1, UK_FIELD_2, .. HAVING     COUNT(*)>1 PLAN (TABLE_NAME NATURAL)

如果此查询返回一些行 - 源数据库中的索引已损坏 - 或不存在

修复索引(删除重复项后)- 运行:

Alter Index INDEX_NAME ACTIVE;

这会重建你的索引

【讨论】:

以上是关于Firebird2.5 错误:“唯一索引中的重复值”没有重复数据的主要内容,如果未能解决你的问题,请参考以下文章

Firebird 2.1 TIMESTAMP 算术和民用间隔

Firebird 烂笔头

IBExpert 和 Firebird 2.5.2 中的并发事务

Firebird最小服务器安装

在AFTER UPDATE触发器上尝试更新只读列错误

IBExpert 中的 Firebird 在访问某些存储过程时抛出错误