3

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

我的问题的简要说明:

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

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

INSERT into [V14].BSMZ SELECT * FROM BSMZ

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

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

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

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

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

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

4

1 回答 1

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;

这会重建你的索引

于 2014-09-12T06:45:07.017 回答