2011-11-09 84 views
-3

我有一个像这样的数据迁移脚本。sql错误 - 唯一约束

Data_migration.sql

它的内容是


insert into table1 select * from old_schema.table1; 
commit; 
insert into table2 select * from old_schema.table2; 
commit; 

而且table1pk_productname约束,当我执行脚本

SQL> @ "data_migration.sql" 

我会得到一个唯一的约束(pk_productname)违规。但是当我执行单个sql语句时,我不会得到任何错误。这背后的任何理由。以及如何解决这个问题。

+0

是否与old_schema.table1上的约束相同? –

+0

约束如何看起来像是什么样,表有没有触发器? – steve

+0

@Phil - 只有8个符合条件的问题。 – APC

回答

5

唯一约束失败意味着您试图插入主键列相互冲突的其中一个记录。

如果它在运行脚本时发生,但不在运行单个语句时发生,则必须在脚本中存在一个错误。没有看到脚本,我们不可能确定那个bug是什么,但最有可能的是你以某种方式两次运行相同的语句。

另一个可能的原因是约束被推迟。这意味着它不会在交易结束之前执行。因此,如果您运行INSERT语句而不发出后续COMMIT,INSERT语句似乎会成功。

在没有启用约束的情况下运行数据迁移很常见。之后使用EXCEPTIONS表重新启用它们。这使得调查问题变得更容易。 Find out more

+0

菲尔:感谢您的信息 – realn

+0

我知道有一个主键违规。 :D 我在问为什么作为一个单独的声明它的工作,并在SQL文件中的相同的声明是给我一个错误。 – realn