2013-05-28 77 views
0

我在oracle中有很多表,但沒有一個主鍵。爲批處理表添加自動增加主鍵的批處理腳本

此外,我們的應用程序已經部署到脫機模式的客戶端服務器。

現在我們想知道,如果我們能夠建立一個補丁更新表,而不用改變存在的記錄:

1)添加主鍵每個表(如id)。

2)使這個主鍵自動增加。

3)更新表格以填充主鍵列。

所以我想知道是否可以創建一個批處理腳本來完成上述工作,然後我可以將它發送給我們的客戶進行更新?

回答

1

您需要創建該列,然後在使其成爲主鍵之前使用唯一值填充該列。這個答案顯示瞭如何使用sequences來做到這一點,這就是你如何在Oracle中自動遞增值。

  1. 添加將作爲主鍵的列(它不能設置爲主鍵)。此示例將該列定義爲NUMBER(12),該列與自然數序列一起爲您提供10^12 - 1個可能的鍵值。如果您認爲您需要更多或更少,請相應地調整列大小。

    ALTER TABLE myTable ADD myTableID NUMBER(12); 
    
  2. 創建一個用於生成唯一值的Oracle SEQUENCE。我通常通過將Seq添加到它們將生成值的表的名稱來命名序列;你應該把它們命名爲你喜歡的。該序列將開始處的值1(START WITH 1),並且因爲沒有增量被定義它將被1

    CREATE SEQUENCE myTableSeq START WITH 1; 
    
  3. 更新新列遞增與從該序列值。這將分配唯一值的每一行:

    UPDATE myTable SET myTableID = myTableSeq.NEXTVAL; 
    
  4. 現在,該列的值可以被指定作爲主鍵(第3步之前,指定其作爲主鍵會失敗,因爲其所有的值分別爲因此不是唯一的):

    ALTER TABLE myTable ADD PRIMARY KEY (myTableID); 
    
  5. 步驟1-4處理現有行。添加trigger自動設置鍵值爲未來行:

    CREATE OR REPLACE TRIGGER myTablePKSet 
    BEFORE INSERT ON myTable 
    FOR EACH ROW 
    BEGIN 
        :NEW.myTableID := myTableSeq.NEXTVAL; 
    END; 
    /
    

將如上圖所示(按順序)的所有命令到一個腳本,你必須爲myTable表的修補程序。根據需要重複其餘表格。

而且在未來,從一開始就實現主鍵。 不是有一個主鍵,這是非常罕見的,並且知道什麼時候表不需要一個主鍵。你最安全的賭注是總是有有一個主鍵。

+0

謝謝您的詳細解答。但是我想知道如果我可以將所有這些命令保存到批處理腳本中並運行它?窗口命令行不會重新規劃oracle命令。 – hguser

+0

您可以將命令保存到腳本中,並且您應該首先在您自己的表格副本上對其進行測試。約定是用'.sql'擴展名來命名腳本,例如'AddPK.sql'。至於運行腳本:(1)將它複製到客戶端的機器上,(2)在Windows命令行中鍵入'sqlplus username @ servername/password',(3)一旦你得到'SQL>'提示符,鍵入at標記('@'),後跟在客戶機上保存的腳本的位置和名稱,例如'@c:\ temp \ AddPK.sql'。 –

+0

謝謝,我明白了。 – hguser