我正在尝试在表中创建新行。表上有两个约束-一个约束在键字段(DB_ID)上,另一个约束一个值是字段ENV的几个约束之一。当我执行插入操作时,我没有将键字段包含为我要插入的字段之一,但是却出现此错误:
unique constraint (N390.PK_DB_ID) violated
这是导致错误的SQL:
insert into cmdb_db
(narrative_name, db_name, db_type, schema, node, env, server_id, state, path)
values
('Test Database', 'DB', 'TYPE', 'SCH', '', 'SB01', 381, 'TEST', '')
我唯一能找到的是,如果手动插入行,Oracle可能会尝试分配一个已经在使用的DB_ID。该数据库中的数据以某种方式从生产数据库中恢复/移动,但是我没有有关如何完成操作的详细信息。
有什么想法吗?
最佳答案
据推测,由于您没有为DB_ID
列提供值,因此该值将由表中定义的插入触发器之前的行级填充。该触发器大概是从序列中选择值。
由于数据是从生产数据库移出的(大概是最近的),所以我的下注是复制数据时,序列也不会被修改。我猜想该序列正在生成的值远低于导致错误的表中当前的最大DB_ID
值。
您可以通过查看触发器来确定正在使用的序列并执行一个
SELECT <<sequence name>>.nextval
FROM dual
并将其与
SELECT MAX(db_id)
FROM cmdb_db
如果我怀疑该序列正在生成数据库中已经存在的值,则可以递增该序列,直到它生成未使用的值为止,或者可以对其进行更改以将
INCREMENT
设置为非常大的值,一次获取nextval,并将INCREMENT
设置回1。
关于oracle - 插入期间违反唯一约束:为什么? (甲骨文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7571245/