在使用生产数据副本测试一些迁移脚本(脚本在开发数据中运行良好)时,我发现了一个奇怪的情况。约束已更改,因此我发出 DROP + ADD 命令:
ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;
ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
CONTROL_ID,
CALLE_AYTO_DUPL
)
ENABLE;
DROP 命令运行良好,但 ADD 命令失败。现在,我陷入了一个恶性循环。我无法删除约束,因为它不存在(初始删除按预期工作):
ORA-02443: 无法删除约束 - 不存在的约束
而且我无法创建它,因为名称已经存在:
ORA-00955: 名称已被现有对象使用
我A_DUP_CALLE_UK1
在 SQL Developer 的搜索框中输入内容,然后……就在那里!所有者、表名、表景......一切都匹配:它不是同名的不同对象,它是我原来的约束。该表出现在约束详细信息中,但约束未出现在表的详细信息中。
我的问题:
- 对此有何解释?
- 当我在实时服务器中进行真正的升级时,如何确保不会发生这种情况?
(服务器是 10g XE,我没有足够的声望来创建标签。)
猜测我会说玛丽安是对的,这是由具有相同名称的唯一索引和约束引起的,例如:
通常,当您添加唯一约束时,会创建一个具有相同名称的唯一索引 - 但索引和约束不是一回事。看看
all_indexes
是否有一个索引被调用A_DUP_CALLE_UK1
,并在你删除它之前尝试弄清楚它是否被其他东西使用!看起来很奇怪。
你可以运行:
检查甲骨文是否抱怨什么样的对象。然后您可以为此运行适当的 DROP 语句。
我能想到的唯一另一件事是完全删除表,
DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS
以摆脱属于该表的所有内容,然后完全重新创建它。如果表包含有价值的数据,您可以在之前对其进行备份:
重新创建表后,您可以执行
来恢复数据。
几分钟前我遇到了同样的问题......我找到了解释。
通过创建主键,Oracle 创建了两个对象:一个约束和一个控制“唯一”部分的索引。
通过删除约束,索引保留在那里,使用相同的索引名称,所以如果你只执行
您将只删除约束。要删除索引,您需要执行
这应该做的工作。或者,您可以使用命令同时执行这两个命令
主键约束带有索引。您删除约束但不删除索引。查看:
你看到
OBJECT_TYPE
的是INDEX
。两者都这样做:
做这个
它会起作用的。
图片: