2011-12-01 17 views
3

存在一個包含三列的現有表格,它們都構成主鍵。爲Oracles DB的現有表添加唯一約束的好方法?

向其添加唯一列的最佳方式是什麼?在Im時爲它創建一個序列。

+0

是否在主鍵或表中添加一個唯一列? – DCookie

+0

在該列上添加一個列和唯一約束。因爲我不能在另一個表上創建一個外鍵約束到第一個表,因爲它的主鍵由它所具有的三個列組成。所以我想創建一個獨特的列,所以我可以從另一個表中引用它。 – rapadura

回答

3

可以附加列一個表上添加一個ALTER TABLE

ALTER TABLE table_name 
    ADD(new_column_name NUMBER UNIQUE); 

您可以創建一個新的序列,然後創建填充使用序列

CREATE SEQUENCE sequence_name; 

CREATE TRIGGER trigger_name 
    BEFORE INSERT ON table_name 
    FOR EACH ROW 
BEGIN 
    :new.new_column_name := sequence_name.nextval; 
END; 

如果新列的觸發器您正在使用11g之前的Oracle版本,您的觸發器需要從DUAL執行SELECT以便填充:new.new_column_name列,而不是直接分配

CREATE TRIGGER trigger_name 
    BEFORE INSERT ON table_name 
    FOR EACH ROW 
BEGIN 
    SELECT sequence_name.nextval 
    INTO :new.new_column_name 
    FROM dual; 
END; 

想必,你也會希望使用序列值初始化所有現有行你開始插入新行

UPDATE table_name 
    SET new_column_name = sequence_name.nextval 
WHERE new_column_name IS NULL 

之前,但它似乎很奇怪,添加一個新生成的序列列複製到具有複合主鍵的現有表,除非目標是將該新列用作主鍵。生成序列生成列的重點在於,您擁有一個穩定的合成主鍵,它不依賴於實際的業務數據。因此,放棄現有主鍵,添加新列,填充數據,將新列聲明爲新主鍵,然後在包含舊主鍵的三列上定義唯一約束似乎更有意義鍵。

+0

我沒有意識到我可以添加獨特的改變表,因爲我認爲空值將是相同的,因此不是唯一的......謝謝賈斯汀! – rapadura

+0

我按照你的建議去做,但使用唯一鍵從其他表引用看起來很奇怪,而主鍵是無用的。 – rapadura

+1

有關UNIQUE約束的一點是它們可以包含NULL值。因此,將一個唯一列添加到填充表中比主鍵更容易(儘管後者並不那麼棘手)。 – APC