主鍵約束設定Enable Novalidate時報錯
我們先回顧一下關於啟用和禁用約束的4種組合:
啟用約束:
enable( validate):啟用約束,建立索引,對已有及新加入的資料執行約束。
enable novalidate:啟用約束,建立索引,僅對新加入的資料強制執行約束,而不管表中的現有資料。
禁用約束:
disable( novalidate):關閉約束,刪除索引,可以對約束列的資料進行修改等操作。
disable validate :關閉約束,刪除索引,不能對錶進行 插入/更新/刪除等操作。
我們針對主鍵約束的enable novalidate做如下測試。
1.建立測試表
點選(此處)摺疊或開啟-
SQL> select * from v$version;
-
-
BANNER
-
----------------------------------------------------------------
-
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
-
PL/SQL Release 10.2.0.4.0 - Production
-
CORE 10.2.0.4.0 Production
-
-
TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
-
NLSRTL Version 10.2.0.4.0 - Production
-
-
SQL> create table hoegh(x number,y number,z number,
-
2 constraint pk_hoegh primary key(x,y));
-
-
Table created
-
-
SQL>
-
SQL> insert into hoegh values(1,1,1);
-
-
1 row inserted
-
-
SQL> insert into hoegh values(1,2,1);
-
-
1 row inserted
-
-
SQL> commit;
-
-
Commit complete
-
-
SQL> select * from hoegh;
-
-
X Y Z
-
---------- ---------- ----------
-
1 1 1
-
1 2 1
-
- SQL>
2.刪除原有主鍵
點選(此處)摺疊或開啟-
SQL> alter table hoegh drop constraint PK_HOEGH cascade drop index;
-
- Table altered
3.新增新主鍵並設定Enable Novalidate,報錯
點選(此處)摺疊或開啟
-
SQL> alter table hoegh add constraint PK_HOEGH primary key(x,z) enable novalidate;
-
-
alter table hoegh add constraint PK_HOEGH primary key(x,z) enable novalidate
-
-
ORA-02437: 無法驗證 (HOEGH.PK_HOEGH) - 違反主鍵
-
- SQL>
我們知道主鍵約束=唯一約束+非空約束,那麼這個是不是和唯一約束有關係呢?接下來,我們嘗試新增一個唯一約束,同時設定Enable Novalidate。
點選(此處)摺疊或開啟
-
SQL> alter table hoegh add constraint unq_xz unique(x,z) enable novalidate;
-
-
alter table hoegh add constraint unq_xz unique(x,z) enable novalidate
-
-
ORA-02299: 無法驗證 (HOEGH.UNQ_XZ) - 找到重複關鍵字
-
- SQL>
那麼如何解決這個問題呢?
4.建立普通索引,然後新增主鍵約束並設定Enable Novalidate,成功
我們可以在建立主鍵前先給該欄位建個普通非唯一索引,這樣建主鍵時系統就會自動利用這個普通索引了。點選(此處)摺疊或開啟
-
SQL>
-
SQL> create index idx_xz on hoegh(x,z);
-
-
Index created
-
-
SQL> alter table hoegh add constraint PK_HOEGH primary key(x,z) enable novalidate;
-
-
Table altered
-
-
SQL> insert into hoegh values(1,3,1);
-
-
insert into hoegh values(1,3,1)
-
-
ORA-00001: 違反唯一約束條件 (HOEGH.PK_HOEGH)
-
-
SQL> select * from hoegh;
-
-
X Y Z
-
---------- ---------- ----------
-
1 1 1
-
1 2 1
-
-
SQL>
-
SQL> insert into hoegh values(1,3,2);
-
-
1 row inserted
-
-
SQL> commit;
-
-
Commit complete
-
-
SQL>
-
SQL> select * from hoegh;
-
-
X Y Z
-
---------- ---------- ----------
-
1 1 1
-
1 2 1
-
1 3 2
-
- SQL>
5.結論
從上面的測試結果看出,enable novalidate在針對主鍵約束或者唯一約束使用時需要先建立相關索引,再使用enable novalidate。
~~~~~~~ the end~~~~~~~~~
hoegh
2016.06.19
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30162081/viewspace-2120425/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle學習(2)-Oracle約束的關鍵字Enable/Disable/Validate/NovalidateOracle
- oracle 約束的novalidate 應用Oracle
- Oracle定義約束 外來鍵約束Oracle
- SQL的主鍵和外來鍵約束SQL
- Oracle主鍵約束、唯一鍵約束、唯一索引的區別(轉)Oracle索引
- oracle 約束 enable validate 檢查Oracle
- Javaweb-約束-外來鍵約束JavaWeb
- [20240228]約束novalidate.txt
- 資料完整性約束:主鍵、外來鍵、各種約束的建立刪除語句
- disable/enable validate/novalidate 的區別
- Oracle約束enable validate時資料檢查Oracle
- oracle鍵約束控制Oracle
- 資料庫約束 主鍵-唯一性-Check-外來鍵資料庫
- alter table modify constraint_disable_enable_novalidateAI
- 解決資料庫的索引亂碼問題,先刪除外來鍵約束,再刪除主鍵約束及其索引資料庫索引
- Sql Server系列:鍵和約束SQLServer
- 查詢(看)表的主鍵、外來鍵、唯一性約束和索引索引
- 關於外來鍵約束和對應主鍵資訊的查詢指令碼指令碼
- 約束:確保資料的完整性(主鍵,唯一,檢查,預設,非空,外來鍵)
- PostgreSQL如何設定主鍵序列?SQL
- ORACLE設定遞增主鍵Oracle
- ORACLE: 查詢(看)表的主鍵、外來鍵、唯一性約束和索引Oracle索引
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 【INDEX】Oracle中主鍵、唯一約束與唯一索引之區別IndexOracle索引
- ts函式約束定義函式
- ts類介面約束定義
- 教你mysql如何增加外來鍵約束MySql
- oracle外來鍵約束的總結Oracle
- MySQL禁用恢復外來鍵約束MySql
- oracle主外來鍵鎖_lock_約束Oracle
- remix合約除錯設定pinfoREM除錯
- 【PK】Oracle 10g刪除主鍵約束後無法刪除唯一約束索引問題的模擬與分析Oracle 10g索引
- Cadence PCB設計之約束管理器(一)——基本設定
- SqlServer主鍵和自增長設定SQLServer
- 批量刪除MSSQL 中主外來鍵約束SQL
- mysql 刪除老是報外來鍵約束MySql
- Sqlserver 設定 自增 主鍵ID identitySQLServerIDE
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql