Cách tạo khóa chính tổng hợp trong SQL Server 2008


178

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


1
Khi bạn chưa quen với asp.net, một lời khuyên: Các khóa chính hỗn hợp là một điều tồi tệ thường chỉ ra một thiết kế thiếu suy nghĩ
smirkingman

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

Câu trả lời:


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

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

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

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

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

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

34
+ 1 Đây là một nỗi đau nếu bạn cần cập nhật hoặc loại bỏ 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ã trước). Ngoài ra, nó xấu.
monty

2
Có bất kỳ lý do tôi sẽ không muốn PK của tôi được nhóm lại?
4 giờ sáng

1
@ 4AM Điều này có thể trả lời câu hỏi của bạn: liên kết
Dongminator

52

Thông qua Trình quản lý doanh nghiệp (SSMS) ...

  • Nhấp chuột phải vào Bảng bạn muốn tạo khóa tổng hợp trên và chọn Thiết kế .
  • Đánh dấu các cột bạn muốn tạo thành một khóa tổng hợp
  • Nhấp chuột phải vào các cột đó và Đặt Khóa chính

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


2
Cảm ơn bạn. Đây là cách an toàn / dễ dàng nhất mà không có khả năng làm rối 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ế / hướng dẫn. Cảm ơn đã giúp đỡ.
Trevor Nestman

32

Tôi biết tôi đến bữa tiệc muộ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.)

27

Đối với máy chủ MSSQL 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 thêm khóa ngoại / khóa chính, trước tiên bạn nên tạo khóa có ràng buộc hoặc bạn không thể thay đổi. Như thế này 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 tế 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> Phím> ..) 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 xem xét mọi thay đổi (bảng thay đổi) bạn cần.

Tôi khuyên bạn nên thiết lập một tiêu chuẩn cho chính mình; các 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.


Điều này không tạo ra PK mà chỉ có FK, phải không?
batmaci

@batmaci; Không, đó là cả FK và nhóm FK gấp đôi thành PK. Sử dụng đó là lành mạnh hơn. Tôi khuyên nó. Khi bạn không tạo PK, bạn cũng có thể sử dụng.
Fatih Mert Doğancan

1

Đầu tiên 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 nhấp chuột phải vào cột này và đặt khóa chính và đặt giá trị gốc của khóa chính.


-3

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

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

-3
CREATE TABLE UserGroup
(
  [User_Id] INT Foreign Key,
  [Group_Id] INT foreign key,

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

2
thêm một số mô tả quá
Abdulla Nilam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.