Oracle使用序列后提示違反唯一約束的解決方案
1、問題原因分析
出現(xiàn)這個(gè)問題的原因是插入數(shù)據(jù)的時(shí)候,由于之前沒有使用序列插入,而是直接插入了一個(gè)比當(dāng)前序列nextval還大的值,即直接將id寫死了。
后面再使用序列插入的時(shí)候,如果序列小于該值的話,是可以正常插入的,當(dāng)序列號(hào)等于之前通過ID寫死的方式插入的ID值時(shí),就會(huì)出現(xiàn)這種情況。
2、解決方案
2.1 第一步:查詢出約束對(duì)應(yīng)的表以及對(duì)應(yīng)字段
select a.constraint_name,a.constraint_type,b.column_name,b.table_name from user_constraints a inner join user_cons_columns b on a.table_name = b.table_name where a.constraint_name = 'SYS_C0016709';
2.2第二步:查詢字段對(duì)應(yīng)的序列(sequence)的下一次值是多少
-- select 序列名.nextval from dual; select ZHGD_DEVICE_SEQ.nextval from dual;
2.3第三步:查詢數(shù)據(jù)表中對(duì)應(yīng)字段的最大值
-- select max(字段) from 表名; select max(ID) from ZHGD_DEVICE;
2.4第四步:修改序列值步進(jìn)大小,更新序列值
-- alter sequence 序列名 increment by 步進(jìn)值(自己定義即可,需要超過數(shù)據(jù)庫表中對(duì)應(yīng)的最大值); alter sequence ZHGD_DEVICE_SEQ increment by 200;
2.5第五步:按照步進(jìn)值將序列值新增,并得到下一個(gè)序列值
-- select 序列名.nextval from dual; select ZHGD_DEVICE_SEQ .nextval from dual;
2.6第六步:恢復(fù)序列值步進(jìn)大小為1
--alter sequence 序列名 increment by 1; alter sequence ZHGD_DEVICE_SEQ increment by 1;
3、總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle數(shù)據(jù)庫常用函數(shù)總結(jié)大全
這篇文章主要介紹了Oracle數(shù)據(jù)庫常用函數(shù)總結(jié)的相關(guān)資料,包括數(shù)值、字符、日期、轉(zhuǎn)換等類型,以及如何使用注釋、運(yùn)算符和處理空值等內(nèi)容,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2025-12-12
Oracle字符函數(shù)應(yīng)用檢測(cè)漢字的方法
這篇文章主要介紹了Oracle字符函數(shù)應(yīng)用檢測(cè)漢字的方法,需要的朋友可以參考下2017-03-03

