2010-10-13 65 views
120

Tôi muốn tạo bảng trong SQL Server 2008, nhưng tôi không biết cách tạo khóa chính hỗn hợp. Làm thế nào tôi có thể đạt được điều này?Cách tạo khóa chính kết hợp trong SQL Server 2008

+1

Là bạn mới tham gia asp.net, một lời khuyên: Các khóa chính hỗn hợp là một điều xấu * thường chỉ ra thiết kế được suy nghĩ kém – smirkingman

+31

@smirkingman Các vấn đề rất quan trọng có thể được giải quyết, thường gần như hoàn toàn với các khóa chính kết hợp. Chẳng hạn như khi bạn có hàng trăm/hàng nghìn người dùng lưu các hàng vào một loại bảng/đối tượng đơn lẻ. Bạn muốn các hàng được sắp xếp theo user-id, cộng với giá trị thứ hai. Đánh giá giá trị của bạn chỉ đơn giản là không chính xác, nếu không, chúng tôi sẽ sớm ngừng sử dụng tính năng này. –

+1

Có thể trùng lặp của [Tạo khóa chính kết hợp trong SQL Server] (http://stackoverflow.com/questions/12594791/creating-composite-primary-key-in-sql-server) –

Trả lời

185
create table my_table (
    column_a integer not null, 
    column_b integer not null, 
    column_c varchar(50), 
    primary key (column_a, column_b) 
); 
+1

Sự khác biệt giữa việc sử dụng ** Chính là gì Khóa ** và ** CONSTRAINT ** như trong ví dụ của @ matthew-abbott? – mateuscb

+24

Nó tạo ra một ràng buộc có tên có thể bị xóa/cập nhật theo tên – longhairedsi

+3

Không hoàn toàn đúng. Cả hai tạo ra "ràng buộc có tên". Nó chỉ là với các cựu, bạn không kiểm soát việc đặt tên. Nhưng khi đã tạo xong, bạn có thể tra cứu tên đã được sử dụng và xóa/cập nhật theo tên ... – Auspex

134
CREATE TABLE UserGroup 
(
    [User_Id] INT NOT NULL, 
    [Group_Id] INT NOT NULL 

    CONSTRAINT PK_UserGroup PRIMARY KEY NONCLUSTERED ([User_Id], [Group_Id]) 
) 
+23

+1 - Có, đặt tên cho những người khó khăn của bạn, Sql Server làm những điều khó chịu như họ PK_UserGrou_5DEAEAF5 trong DB của một bản phát hành và PK_UserGrou_3214EC0777F66C69 trên khác. Đây là một nỗi đau nếu bạn cần cập nhật hoặc thả PK vì trước tiên bạn phải lấy tên từ db và sau đó sử dụng sql động (hoặc xây dựng lệnh trong mã đầu tiên). Ngoài ra, nó xấu xí. – monty

+0

Có lý do gì khiến tôi không muốn nhóm PK của tôi được nhóm lại không? – 4AM

+0

@ 4AM Điều này có thể trả lời câu hỏi của bạn: [link] (https://dba.stackexchange.com/questions/7741/when-should-a-primary-key-be-declared-non-clustered) – Dongminator

37

Via Enterprise Manager (SSMS) ...

  • Kích chuột phải vào bảng bạn muốn tạo phím hợp trên và chọn Thiết kế.
  • Highlight cột bạn muốn để hình thành như một hỗn hợp chính
  • Right Click trên các cột và Set Primary Key

Để xem SQL sau đó bạn có thể nhấp chuột phải vào Table>Script Table As >Create To

+1

Cảm ơn bạn. Đây là cách an toàn nhất/dễ nhất mà không có khả năng làm rối tung cú pháp SQL của tôi – AlbatrossCafe

+1

Điều này giúp dễ dàng cho những ai muốn sửa chữa nhanh chóng thông qua giao diện thiết kế/guid. Cảm ơn đã giúp đỡ. –

1

Trước tiên hãy tạo cơ sở dữ liệu và bảng, thêm các cột theo cách thủ công. Trong đó cột là khóa chính. Bạn nên kích chuột phải vào cột này và thiết lập khóa chính và thiết lập giá trị hạt giống của khóa chính.

-3

Để tạo một khóa duy nhất tổng hợp trên bảng

ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2], [column3]); 
+4

Phím UNIQUE KHÔNG giống với khóa CHÍNH! –

9

Tôi biết tôi là muộn để bên này, nhưng đối với một bảng hiện có, hãy thử:

ALTER table TABLE_NAME 
ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED (column1, column2, etc.) 
-1
CREATE TABLE UserGroup 
(
    [User_Id] INT Foreign Key, 
    [Group_Id] INT foreign key, 

PRIMARY KEY ([User_Id], [Group_Id]) 
) 
+1

thêm một số mô tả quá –

+4

6 năm trễ và cú pháp không chính xác! –

9

Đối với MSSQL Server 2012

CREATE TABLE usrgroup(
    usr_id int FOREIGN KEY REFERENCES users(id), 
    grp_id int FOREIGN KEY REFERENCES groups(id), 

    PRIMARY KEY (usr_id, grp_id) 
) 

CẬP NHẬT

Tôi nên thêm!

Nếu bạn muốn các khóa ngoại/khóa chính này thay đổi, trước tiên bạn nên tạo với hạn chế hoặc bạn không thể thực hiện thay đổi. Như dưới đây;

CREATE TABLE usrgroup(
    usr_id int, 
    grp_id int, 

    CONSTRAINT FK_usrgroup_usrid FOREIGN KEY (usr_id) REFERENCES users(id), 
    CONSTRAINT FK_usrgroup_groupid FOREIGN KEY (grp_id) REFERENCES groups(id), 

    CONSTRAINT PK_usrgroup PRIMARY KEY (usr_id,grp_id) 
) 

Thực ra cách cuối cùng là lành mạnh và nối tiếp. Bạn có thể xem các tên Ràng buộc FK/PK (dbo.dbname> Keys> ..) nhưng Nếu bạn không sử dụng ràng buộc, MSSQL sẽ tự động tạo các tên FK/PK ngẫu nhiên. Bạn sẽ cần phải xem xét mọi thay đổi (thay đổi bảng) mà bạn cần.

Tôi khuyên bạn nên đặt tiêu chuẩn cho chính mình và ràng buộc phải được xác định theo tiêu chuẩn của bạn. Bạn sẽ không phải ghi nhớ và bạn sẽ không phải suy nghĩ quá lâu. Tóm lại, bạn làm việc nhanh hơn.

+0

điều này không tạo PK nhưng chỉ FK, phải không? – batmaci

+0

@batmaci; Không, nó là cả FK và FK nhóm đôi để PK. Đó là sử dụng lành mạnh. Tôi khuyên điều đó. Khi bạn không tạo PK, bạn cũng có thể sử dụng. –

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