วิธีสร้างคีย์หลักแบบรวมใน SQL Server 2008


178

ฉันต้องการสร้างตารางใน SQL Server 2008 แต่ฉันไม่รู้วิธีสร้างคีย์หลักแบบรวม ฉันจะบรรลุสิ่งนี้ได้อย่างไร


1
ในขณะที่คุณยังใหม่กับ asp.net คำแนะนำบางอย่าง: คีย์หลักแบบคอมโพสิตเป็นสิ่งที่ไม่ดีที่มักจะบ่งบอกถึงการออกแบบที่ไม่ดีพอ
smirkingman

47
@ smirkingman ปัญหาที่สำคัญมากสามารถแก้ไขได้มักจะเกือบพิเศษกับคีย์หลักประกอบ เช่นเมื่อคุณมีผู้ใช้หลายแสนคนที่บันทึกแถวไปยังประเภทตาราง / เอนทิตีเดียว คุณต้องการแถวที่เรียงตาม user-id รวมถึงค่าที่สอง การตัดสินคุณค่าของคุณนั้นไม่ถูกต้องหากไม่เราจะทำการยกเลิกคุณสมบัตินี้ในไม่ช้า
Nicholas Petersen

คำตอบ:


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
อะไรคือความแตกต่างระหว่างการใช้คีย์หลักและข้อ จำกัดเช่นในตัวอย่างโดย @ matthew-abbott
mateuscb

28
มันสร้างข้อ จำกัด ที่มีชื่อที่สามารถลบ / อัปเดตด้วยชื่อ
longhairedsi

14
ไม่จริงเลยทีเดียว ทั้งสองสร้าง "ข้อ จำกัด ที่มีชื่อ" เป็นเพียงกับอดีตคุณไม่ได้ควบคุมการตั้งชื่อ แต่สร้างขึ้นครั้งเดียวคุณสามารถดูชื่อที่ถูกนำมาใช้และลบ / อัปเดตโดยใช้ชื่อ ...
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 - ใช่ตั้งชื่อคนที่มีข้อ จำกัด ของคุณมิฉะนั้น Sql Server จะทำสิ่งที่น่ารังเกียจเช่นตั้งชื่อพวกเขาให้เป็น PK_UserGrou_5DEAEAF5 ใน DB และ PK_UserGrou_3214EC0777F66C69 นี่เป็นความเจ็บปวดหากคุณต้องการอัปเดตหรือวาง PK เนื่องจากคุณต้องรับชื่อจาก db ก่อนจากนั้นใช้ dynamic sql (หรือสร้างคำสั่งในรหัสก่อน) นอกจากนี้มันน่าเกลียด
monty

2
มีเหตุผลใดที่ฉันไม่ต้องการให้ PK ของฉันเป็นคลัสเตอร์?
4AM

1
@ 4AM นี่อาจตอบคำถามของคุณ: ลิงก์
Dongminator

52

ผ่านผู้จัดการองค์กร (SSMS) ...

  • คลิกขวาที่ตารางที่คุณต้องการสร้างคีย์คอมโพสิตและเลือกการออกแบบ
  • ไฮไลต์คอลัมน์ที่คุณต้องการสร้างเป็นคีย์ผสม
  • คลิกขวาที่คอลัมน์เหล่านั้นและตั้งค่าคีย์หลัก

หากต้องการดู SQL แล้วคุณสามารถคลิกขวาบนTable> Script Table As>Create To


2
ขอบคุณ. นี่เป็นวิธีที่ปลอดภัยที่สุด / ง่ายที่สุดโดยไม่ทำให้สับสนกับไวยากรณ์ SQL ของฉัน
AlbatrossCafe

1
สิ่งนี้ทำให้ง่ายสำหรับผู้ที่ต้องการแก้ไขด่วนผ่านทางส่วนออกแบบ / guid ขอบคุณสำหรับความช่วยเหลือ
Trevor Nestman

32

ฉันรู้ว่าฉันมาปาร์ตี้สายนี้ แต่สำหรับโต๊ะที่มีอยู่ลอง:

ALTER table TABLE_NAME
ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED (column1, column2, etc.)

27

สำหรับ 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)
)

UPDATE

ฉันควรเพิ่ม!

หากคุณต้องการเพิ่มการเปลี่ยนคีย์ต่างประเทศ / หลักอันดับแรกคุณควรสร้างคีย์ด้วยข้อ จำกัด หรือคุณไม่สามารถทำการเปลี่ยนแปลงได้ เช่นนี้ด้านล่าง:

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)
)

จริง ๆ แล้ววิธีสุดท้ายคือ healthier และต่อเนื่อง คุณสามารถค้นหาชื่อข้อ จำกัด FK / PK (dbo.dbname> คีย์> .. )แต่ถ้าคุณไม่ใช้ข้อ จำกัด MSSQL จะสร้างชื่อ FK / PK แบบสุ่มโดยอัตโนมัติ คุณจะต้องดูการเปลี่ยนแปลงทุกอย่าง (แก้ไขตาราง) ที่คุณต้องการ

ฉันแนะนำให้คุณตั้งมาตรฐานสำหรับตัวคุณเอง ข้อ จำกัด ควรกำหนดตามมาตรฐานของคุณ คุณจะไม่ต้องจดจำและคุณจะไม่ต้องคิดนานเกินไป ในระยะสั้นคุณทำงานได้เร็วขึ้น


สิ่งนี้ไม่ได้สร้าง PK แต่มีเพียง FK เท่านั้นใช่ไหม
batmaci

@batmaci; ไม่มันเป็นทั้ง FK และสองกลุ่ม FK ถึง PK การใช้นั้นดีต่อสุขภาพ ฉันแนะนำให้มัน เมื่อคุณไม่ได้สร้าง PK คุณสามารถใช้งานได้เช่นกัน
Fatih Mert Doğancan

1

ขั้นแรกสร้างฐานข้อมูลและตารางเพิ่มคอลัมน์ด้วยตนเอง ในคอลัมน์ใดที่จะเป็นคีย์หลัก คุณควรคลิกขวาที่คอลัมน์นี้และตั้งค่าคีย์หลักและตั้งค่าเมล็ดของคีย์หลัก



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.