2012-11-05 49 views
8

Khi script sql xuất khẩu bởi SQL Developer có nhiều tùy chọn có sẵn, nhưng một trong hai con đường đó phải tạo ra một UNIQUE INDEX trên khóa chính như thế nàyPrimary Key và Unique Index - script sql tạo ra bởi SQL Developer

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

và thêm PRIMARY KEY vào cùng một bảng và cùng một cột

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

Vì vậy, câu hỏi là: có vẻ như loại dự phòng? Tôi nghĩ rằng tạo ra một khóa chính trên một cột nên theo mặc định tạo ra một chỉ số duy nhất trên cột đó quá? Vậy tại sao lệnh đầu tiên là cần thiết?

Và điều này có thể gây ra dư thừa dữ liệu?

Tôi đang sử dụng Oracle 11g vì vậy hãy chia sẻ bất kỳ ý tưởng nào về lý do tại sao nó phải giống như trên.

Xin cảm ơn trước.

+2

đọc sách này có thể giúp bạn http://viralpatel.net/blogs/understanding-primary-keypk-constraint-in-oracle/ – jazzytomato

+0

Bài viết tuyệt vời;) – Dreamer

Trả lời

6

Không có dự phòng - hoặc chỉ một chút :)

Lệnh thứ hai sẽ sử dụng chỉ mục khả dụng nếu tồn tại. Nếu không (nếu DDL đầu tiên không tồn tại) sẽ tạo ra một chỉ mục.

Việc chia thành hai lệnh là hữu ích khi bạn đã đưa ra một tên thích hợp cho chỉ mục và muốn giữ nó.

CẬP NHẬT: Các liên kết chỉ định bởi Thomas Haratyk là phải đọc, tôi thực sự thích nó: http://viralpatel.net/blogs/understanding-primary-keypk-constraint-in-oracle/

UPDATE2: a_horse_with_no_name vậy là hợp lý, nó có thể được thực hiện trong một tuyên bố duy nhất như:

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

Vì vậy, nó sẽ giữ tên (sẽ không tạo tên đối tượng sysblalbla) và nếu bạn sử dụng từ khóa 'SỬ DỤNG INDEX', bạn có thể chỉ định các thuộc tính chỉ mục, ví dụ như các thuộc tính lưu trữ.

Nhưng một lần nữa, bạn sẽ không gặp bất kỳ vấn đề gì với hai câu lệnh đó, chỉ một chỉ mục được tạo.

Có lẽ nhà phát triển SQL muốn nhận ddl cho mỗi đối tượng và có thể có trường hợp khi nó tốt hơn.

+0

Nó có thể được thực hiện chỉ với một tuyên bố duy nhất. –

+0

Cảm ơn vì intel. @a_horse_with_no_name bạn có thể vui lòng đưa ra một câu lệnh đơn như là một sự kết hợp chính thức của hai 'với một tên chỉ mục'? Ý tôi là, chúng ta có thể chỉ định tên chỉ mục trong lệnh 'ALTER TABLE' khi tạo khóa chính không? Cảm ơn – Dreamer

+1

@Dreamer: 'thay đổi bảng foo thêm ràng buộc pk_foo khóa chính (id)' sẽ tạo ra một ràng buộc có tên là 'PK_FOO' và một chỉ mục có cùng tên. Bạn có thể định nghĩa chỉ mục một cách riêng biệt nếu bạn muốn: 'thay đổi bảng foo thêm ràng buộc pk_foo khóa chính (id) bằng chỉ mục (tạo chỉ mục pk_index_for_foo trên foo (id));' –

Các vấn đề liên quan