เพิ่มคอลัมน์ใหม่ที่มีข้อ จำกัด ของคีย์ต่างประเทศในคำสั่งเดียว


128

ฉันกำลังพยายามเพิ่มคอลัมน์ใหม่ที่จะเป็นคีย์ต่างประเทศ ฉันสามารถเพิ่มคอลัมน์และข้อ จำกัด ของคีย์นอกโดยใช้ALTER TABLEคำสั่งแยกกันสองคำสั่ง:

ALTER TABLE one
ADD two_id integer;

ALTER TABLE one
ADD FOREIGN KEY (two_id) REFERENCES two(id);

มีวิธีดำเนินการโดยใช้คำสั่ง ALTER TABLE หนึ่งคำสั่งแทนที่จะเป็นสองคำสั่งหรือไม่? ฉันไม่สามารถคิดอะไรที่ได้ผล


คำตอบ:


186

บ่อยครั้งที่มีคำถามเกี่ยวกับ SQL จึงขึ้นอยู่กับ DBMS DBMS บางตัวอนุญาตให้คุณรวมการดำเนินการเปลี่ยนแปลงตารางโดยคั่นด้วยลูกน้ำ ตัวอย่างเช่น...

ไวยากรณ์Informix :

ALTER TABLE one
    ADD two_id INTEGER,
    ADD CONSTRAINT FOREIGN KEY(two_id) REFERENCES two(id);

ไวยากรณ์สำหรับIBM DB2 LUWจะคล้ายกันโดยทำซ้ำคีย์เวิร์ด ADD แต่ (ถ้าฉันอ่านไดอะแกรมอย่างถูกต้อง) ไม่ต้องการคอมมาเพื่อแยกรายการที่เพิ่ม

ไวยากรณ์ของ Microsoft SQL Server :

ALTER TABLE one
    ADD two_id INTEGER,
    FOREIGN KEY(two_id) REFERENCES two(id);

คนอื่น ๆ บางคนไม่อนุญาตให้คุณรวมการดำเนินการ ALTER TABLE เช่นนั้น Standard SQL อนุญาตให้ดำเนินการเพียงครั้งเดียวในคำสั่ง ALTER TABLE ดังนั้นใน Standard SQL จึงต้องทำในสองขั้นตอน


5
การเพิ่มและข้อ จำกัด ที่สอง
Imran

19
สำหรับส่วน SQL ในการตั้งชื่อให้กับข้อ จำกัด คุณต้องเขียนดังนี้: ALTER TABLE [Messages] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID);
Dragos Durlut

79

ใน MS-SQLServer:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)

สำหรับ DB Engine นี้คืออะไร?
knocte

@knocte สำหรับเซิร์ฟเวอร์ ms sql - ขณะนี้มีการแท็กคำถามเพื่อชี้แจงว่า
sqladmin

ฉันไม่คิดว่าคำถามต้องการความกระจ่างเนื่องจากคำตอบที่ยอมรับแล้วระบุว่ามีความแตกต่างอย่างมากระหว่าง DB Engine ในวิธีการทำสิ่งที่ต้องชี้แจงคือคำตอบของคุณดังนั้นฉันจึงทำอย่างนั้น
knocte

9
ขึ้นสำหรับการตั้งชื่อข้อ จำกัด ของคุณ คำตอบที่ยอมรับได้ช่วยให้ระบบสร้างชื่อซึ่งยุ่งยากและยากที่จะจัดการในภายหลัง
Derpy

17

สำหรับ SQL Server ควรเป็นเช่นนี้

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)

1
นี่เป็นคำตอบที่กระชับกว่าคำตอบอื่น ๆ เล็กน้อย
แซม

11

ในMS SQL SERVER:

ด้วยชื่อคีย์ต่างประเทศที่ผู้ใช้กำหนด

ALTER TABLE tableName
ADD columnName dataType,
CONSTRAINT fkName FOREIGN KEY(fkColumnName) 
   REFERENCES pkTableName(pkTableColumnName);

โดยผู้ใช้ไม่ได้กำหนดชื่อคีย์ต่างประเทศ

ALTER TABLE tableName
ADD columnName dataType,
FOREIGN KEY(fkColumnName) REFERENCES pkTableName(pkTableColumnName);


2

อัปเดตปี 2020

เป็นคำถามที่ค่อนข้างเก่า แต่ผู้คนยังคงกลับมาที่ฉันเห็น ในกรณีที่คำตอบข้างต้นไม่ได้ช่วยคุณตรวจสอบให้แน่ใจว่าคุณใช้ประเภทข้อมูลเดียวกันสำหรับคอลัมน์ใหม่กับรหัสของตารางอื่น

ในกรณีของฉันฉันใช้ Laravel และฉันใช้ "จำนวนเต็มที่ไม่ได้ลงชื่อ" สำหรับรหัสทั้งหมดของฉันเนื่องจากไม่มีจุดที่จะมี ID ติดลบ LOL

ดังนั้นแบบสอบถาม SQL ดิบจะเปลี่ยนไปดังนี้:

ALTER TABLE `table_name`
ADD `column_name` INTEGER UNSIGNED,
ADD CONSTRAINT constrain_name FOREIGN KEY(column_name) REFERENCES foreign_table_name(id);

ฉันหวังว่ามันจะช่วยได้


1
"ADD CONSTRAINT" ควรเป็น "CONSTRAINT" ใช่หรือไม่
TimH





0

หากคุณต้องเพิ่มค่าเริ่มต้นในกรณีที่คุณมีแถวในตารางอยู่แล้วให้เพิ่มค่าเริ่มต้น

ALTER TABLE one
ADD two_id int DEFAULT 123,
FOREIGN KEY(two_id) REFERENCES two(id);

0

ลองสิ่งนี้:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);

1
ยินดีต้อนรับสู่ SO! โปรดแสดงความคิดเห็นคำตอบของคุณเมื่อเป็นเพียงรหัส ในกรณีของคุณมีคำตอบมากมายที่คล้ายกับของคุณดังนั้นจงเปิดเผยผลประโยชน์ของคุณ
David García Bodego
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.