2012-11-05 28 views
8

當出口SQL腳本由SQL開發人員有可用的多種選擇,但無論哪種方式都存在上生成主鍵UNIQUE INDEX這樣主鍵和唯一索引 - 通過SQL Developer生成的SQL腳本

CREATE UNIQUE INDEX "SYS_C0018099" ON "TRANSACTION" ("ID") 

並添加PRIMARY KEY同一個表和相同的列

ALTER TABLE "TRANSACTION" ADD PRIMARY KEY ("ID") 

因此問題是:它看起來像是一種冗餘的?我認爲在列上創建主鍵時應該默認在該列上創建唯一索引?那麼爲什麼第一個命令是必要的?

這可能會導致數據冗餘?

我在Oracle 11g上,請分享關於它爲什麼應該如上所示的任何想法。

在此先感謝。

+2

閱讀此可能會幫助您http://viralpatel.net/blogs/understanding-primary-keypk-constraint-in-oracle/ – jazzytomato

+0

偉大的文章;) – Dreamer

回答

6

沒有冗餘 - 或僅僅一點點:)

如果存在第二個命令將使用現有的索引。否則(如果第一個DDL不存在)將創建一個索引。

當您爲索引命名並想要保留它時,分成兩個命令很有用。

UPDATE:托馬斯Haratyk表示鏈接是一個必須閱讀,我真的很喜歡它:http://viralpatel.net/blogs/understanding-primary-keypk-constraint-in-oracle/

UPDATE2:a_horse_with_no_name是正確的,它可以在一個單一的語句來完成的,如:

alter table TRANSACTION 
add CONSTRAINT pk_test PRIMARY KEY (id); 

因此,它將保留名稱(不會創建sysblalbla對象名稱),並且如果使用'USING INDEX'關鍵字,則可以指定索引屬性,例如存儲屬性。

但是,您不會對這兩條語句有任何問題,只會創建一個索引。

也許SQL Developer更喜歡每個對象獲得一個ddl,並且可能會出現這種情況。

+0

儘管它可以用一個單一的聲明來完成。 –

+0

感謝intel。 @a_horse_with_no_name可以給你一個單一的陳述,作爲這兩個「與索引名稱」的正式組合嗎?我的意思是,在創建主鍵時,我們可以在'ALTER TABLE'命令中指定一個索引名嗎?謝謝 – Dreamer

+1

@Dreamer:'alter table foo add constraint pk_foo primary key(id)'將創建一個名爲'PK_FOO'的約束和一個同名的索引。如果你願意,你可以單獨定義索引:'alter table foo add constraint pk_foo primary key(id)using index(create index pk_index_for_foo on foo(id));' –