2014-12-30 64 views
0

我有一個爲Oracle數據庫編寫的腳本,我正在將其轉換爲在SQL Server中工作,並且有兩個關於特定代碼段的問題。指定索引到約束條件

甲骨文腳本我有這樣的代碼:

CREATE UNIQUE INDEX "PK_PORTALROLES" ON "PORTAL_ROLE" ("ROLE_NAME"); 

ALTER TABLE "PORTAL_ROLE" ADD CONSTRAINT "PK_PORTALROLES" 
     PRIMARY KEY ("ROLE_NAME") USING INDEX ENABLE; 

問題(1)

從上面什麼是在ALTER TABLE線做USING INDEX命令的代碼?它是將第一行創建的UNIQUE INDEX分配給新創建的CONSTRAINT還是CONSTRAINT創建時使用新的UNIQUE INDEX

問題(2)

在SQL Server複製此,我註釋掉CREATE UNIQUE INDEX一行:

--CREATE UNIQUE INDEX "PK_PORTALROLES" ON "PORTAL_ROLE" ("ROLE_NAME"); 

然後替換這個ALTER TABLE行:

ALTER TABLE "PORTAL_ROLE" ADD CONSTRAINT "PK_PORTALROLES" PRIMARY KEY ("ROLE_NAME"); 

據我所知,當在SQL Server中創建PRIMARY KEY CONSTRAINT a UNIQUE INDEX自動生成。那麼,直接在上面的SQL Server代碼的一行與上面的兩行Oracle代碼做同樣的事情呢?

編輯

最後一個問題。 Oracle和SQL Server中有沒有辦法將現有的INDEX分配給CONSTRAINT

回答

0

在Oracle中,你可以做

alter table PORTAL_ROLE add constraint pk_portalroles primary key('ROLE_NAME'); 

而且它會爲你創建唯一索引。但是,當您放棄或禁用(!)約束時,它會放棄該索引。爲了避免這種情況(或爲索引一些自定義名稱,或使用非唯一索引等),它通常分兩步完成(如ORACLE所推薦的)。

Q1:約束將使用現有的索引。

問題2:是的,它對於SQL Server來說已經足夠了。

When you specify a unique constraint on one or more columns, Oracle implicitly creates an index on the unique key. If you are defining uniqueness for purposes of query performance, then Oracle recommends that you instead create the unique index explicitly using a CREATE UNIQUE INDEX statement. You can also use the CREATE UNIQUE INDEX statement to create a unique function-based index that defines a conditional unique constraint.

1

甲骨文

如果沒有在列上要添加PK約束不止一個指標,我們可以選擇性地選擇索引使用「使用索引」的PK被assoicated。本條款可用於:

第一次添加PK約束(使用「ALTER TABLE」命令)。

CREATE TABLE tbl_test (col_1 NUMBER, 
         col_2 NUMBER, 
         col_3 NUMBER); 

CREATE INDEX idx_col_1_2 ON tbl_test(col_1, col_2); 

CREATE INDEX idx_col_1_3 ON tbl_test(col_1, col_3); 

CREATE UNIQUE INDEX idx_col_1 ON tbl_test(col_1); 

-- Forcing oracle to use the unique index "IDX_COL_1" 
ALTER TABLE tbl_test ADD CONSTRAINT tbl_test_pk PRIMARY KEY(col_1) 
USING INDEX idx_col_1; 

SELECT constraint_name, constraint_type, index_name 
    FROM user_constraints 
WHERE table_name = 'TBL_TEST'; 

-- CONSTRAINT_NAME | CONSTRAINT_TYPE | INDEX_NAME 
-- TBL_TEST_PK  | P    | IDX_COL_1 

如果?如果不使用使用INDEX條款

ALTER TABLE tbl_test ADD CONSTRAINT tbl_test_pk PRIMARY KEY(col_1); 

- 儘管存在唯一索引,Oracle已經拿起第一個索引

SELECT constraint_name, constraint_type, index_name 
    FROM user_constraints 
WHERE table_name = 'TBL_TEST'; 

-- CONSTRAINT_NAME | CONSTRAINT_TYPE | INDEX_NAME 
-- TBL_TEST_PK  | P    | IDX_COL_1_2 

這表明與PK相關的指數約束不必是唯一的。

但在SQLServer的隱含當任何一列

所以定義爲你的最後一個問題的主鍵聚集索引將被創建。在Oracle中,您可以將我們創建的索引分配給我們將來創建的約束。 在SQLServer中,我猜這是不可能的。

+0

在SQL Server中,PK將只聚集,如果表不已經有一個聚集索引。如果一個表已經有一個聚集索引,它將被保留。 –