插入期间唯一的约束违规:为什么?(Oracle)的

Sea*_*ean 15 oracle unique-constraint

我正在尝试在表格中创建一个新行.表上有两个约束 - 一个在关键字段(DB_ID)上,另一个约束一个值为字段ENV中的几个之一.当我执行插入操作时,我不会将键字段包含为我要插入的字段之一,但是我收到此错误:

unique constraint (N390.PK_DB_ID) violated
Run Code Online (Sandbox Code Playgroud)

这是导致错误的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', '')
Run Code Online (Sandbox Code Playgroud)

我唯一能够看到的是,如果手动插入行,Oracle可能会尝试分配已经在使用的DB_ID.此数据库中的数据以某种方式从生产数据库中恢复/移动,但我没有详细说明如何完成.

有什么想法吗?

Jus*_*ave 40

据推测,由于您没有为DB_ID列提供值,因此该值将在表上定义的插入触发器之前由行级填充.据推测,该触发器是从序列中选择值.

由于数据是从生产数据库中移动的(大概是最近的),我的赌注是在复制数据时,序列也没有被修改.我猜测序列生成的值远低于DB_ID表中当前导致错误的最大值.

您可以通过查看触发器以确定正在使用哪个序列并执行操作来确认此怀疑

SELECT <<sequence name>>.nextval
  FROM dual
Run Code Online (Sandbox Code Playgroud)

并将其与...进行比较

SELECT MAX(db_id)
  FROM cmdb_db
Run Code Online (Sandbox Code Playgroud)

如果,正如我怀疑的那样,序列正在生成数据库中已存在的值,则可以递增序列,直到它生成未使用的值,或者您可以更改它以将其设置INCREMENT为非常大的值,获取nextval一次,并设置INCREMENT回到1.