技術員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務器類 >

sql腳本導入Oracle時重復生成check約束怎么辦

來源:技術員聯(lián)盟┆發(fā)布時間:2017-10-07 00:08┆點擊:

  最近在工作中一位細心的同事發(fā)現(xiàn)產(chǎn)品的全量sql腳本中有一些重復的check約束檢查,就像下圖這樣的

sql腳本導入Oracle時重復生成check約束怎么辦 三聯(lián)

  重復腳本

  怪異之處還在于,每次執(zhí)行一遍該腳本,然后導出腳本,在導出腳本中重復的次數(shù)就會增加一遍。通過navicat,最終確認每導入一次就會新增加一條重復的check約束,如下圖所示

sql腳本導入Oracle時重復生成check約束怎么辦

  navicat

  這個全量腳本是直接從數(shù)據(jù)庫中導出的,為了方便導入其他的Oracle數(shù)據(jù)庫中,從產(chǎn)品的出貨庫導出時手動去掉了服務名、雙引號。

  通過如下步驟可復現(xiàn)該問題:

  1.創(chuàng)建表

  CREATE TABLE PD_WEB_FILEUPLOAD_CHUNK (

  ID VARCHAR2(32 BYTE) NOT NULL ,

  MD5 VARCHAR2(32 BYTE) DEFAULT NULL NULL ,

  CHUNK NUMBER DEFAULT NULL NULL ,

  FILE_DIR VARCHAR2(200 BYTE) NOT NULL

  )

  可以看到上面的腳本中有NOT NULL的標識,執(zhí)行完后在navicat中可以看到結果是這樣的

sql腳本導入Oracle時重復生成check約束怎么辦

  navicat

  注意看,這里的check約束是帶雙引號的。

  2.執(zhí)行增加check約束的腳本

  ALTER TABLE PD_WEB_FILEUPLOAD_CHUNK ADD CHECK (ID IS NOT NULL);

  ALTER TABLE PD_WEB_FILEUPLOAD_CHUNK ADD CHECK (FILE_DIR IS NOT NULL);

  執(zhí)行了兩遍后,結果如圖所示

sql腳本導入Oracle時重復生成check約束怎么辦

  navicat

  測試到這里,以為最終終于找到了原因,確認為雙引號的問題。抱著嚴謹?shù)膽B(tài)度,再次確認了一下

  3.執(zhí)行帶雙引號的check約束的腳本

  ALTER TABLE PD_WEB_FILEUPLOAD_CHUNK ADD CHECK ("ID" IS NOT NULL);

  ALTER TABLE PD_WEB_FILEUPLOAD_CHUNK ADD CHECK ("FILE_DIR" IS NOT NULL);

  結果如圖所示:

sql腳本導入Oracle時重復生成check約束怎么辦

  navicat

  靠!居然還是會重復生成!

  解決方法

  驗證到這里,算是找出了原因。

  在全量導出的腳本中,創(chuàng)建表的腳本中已經(jīng)隱含了檢查約束,如果再顯示的添加檢查約束就會重復生成。所以,解決辦法為需要手動刪除所有顯示的檢查約束。