Tambahkan kolom baru dengan batasan kunci asing dalam satu perintah

128

Saya mencoba menambahkan kolom baru yang akan menjadi kunci asing. Saya telah dapat menambahkan kolom dan batasan kunci asing menggunakan dua ALTER TABLEperintah terpisah :

ALTER TABLE one
ADD two_id integer;

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

Apakah ada cara untuk melakukan ini dengan satu perintah ALTER TABLE, bukan dua? Saya tidak dapat menemukan apa pun yang berhasil.

jamur
sumber

Jawaban:

185

Seperti yang sering terjadi pada pertanyaan terkait SQL, itu tergantung pada DBMS. Beberapa DBMS memungkinkan Anda untuk menggabungkan operasi tabel ALTER dipisahkan oleh koma. Sebagai contoh...

Sintaks Informix :

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

Sintaks untuk IBM DB2 LUW serupa, mengulangi kata kunci ADD tetapi (jika saya membaca diagram dengan benar) tidak memerlukan koma untuk memisahkan item yang ditambahkan.

Sintaks Microsoft SQL Server :

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

Beberapa yang lain tidak memungkinkan Anda untuk menggabungkan operasi ALTER TABLE seperti itu. SQL Standar hanya memungkinkan operasi tunggal dalam pernyataan ALTER TABLE, jadi dalam SQL Standar, itu harus dilakukan dalam dua langkah.

Jonathan Leffler
sumber
5
Tambah kedua dan kendala.
Imran
18
Untuk bagian SQL, untuk memberi nama pada batasan, Anda menulisnya seperti ini: ALTER TABLE [Pesan] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENSI AlertTriggers (AlertTriggerID);
Dragos Durlut
78

Dalam MS-SQLServer:

ALTER TABLE one
ADD two_id integer CONSTRAINT fk FOREIGN KEY (two_id) REFERENCES two(id)
sqladmin
sumber
untuk apa mesin DB ini?
knocte
@knocte itu untuk ms sql server - pertanyaan sekarang ditandai untuk mengklarifikasi bahwa
sqladmin
Saya tidak berpikir pertanyaan itu perlu diklarifikasi, karena jawaban yang diterima sudah menyatakan bahwa ada perbedaan besar antara mesin DB dalam cara melakukannya, apa yang perlu diklarifikasi adalah jawaban Anda, jadi saya baru saja melakukannya
knocte
9
Siap untuk menyebutkan batasan Anda. Jawaban yang diterima memungkinkan sistem menghasilkan nama, yang menjengkelkan dan sulit dikelola nantinya.
Derpy
17

Untuk SQL Server harus seperti itu

ALTER TABLE one
ADD two_id integer constraint fk foreign key references two(id)
jausel
sumber
1
Ini sedikit lebih ringkas daripada jawaban lainnya.
Sam
11

Dalam MS SQL SERVER:

Dengan nama kunci asing yang ditentukan pengguna

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

Tanpa nama kunci asing yang ditentukan pengguna

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

Di Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);
O. Badr
sumber
2

Pembaruan 2020

Itu pertanyaan yang lumayan lama, tapi orang masih kembali ke sana. Jika jawaban di atas tidak membantu Anda, pastikan Anda menggunakan tipe data yang sama untuk kolom baru seperti id pada tabel lainnya.

Dalam kasus saya, saya menggunakan Laravel dan saya menggunakan "unsigned integer" untuk semua id saya karena tidak ada gunanya memiliki LOL id negatif.

Jadi untuk itu, permintaan SQL mentah akan berubah seperti ini:

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

Saya harap ini membantu

Pelajar
sumber
1
"ADD CONSTRAINT" seharusnya hanya "CONSTRAINT", ya?
TimH
1

Anda dapat melakukannya seperti di bawah ini di SQL Server

ALTER TABLE one
ADD two_id int foreign key
REFERENCES two(id)
pengguna2010014
sumber
1

PostgreSQL DLL untuk menambahkan kolom FK:

ALTER TABLE one
ADD two_id INTEGER REFERENCES two;
Kshitij Bajracharya
sumber
1

ALTER TABLE TableName ADD NewColumnName INTEGER, FOREIGN KEY(NewColumnName) REFERENCES [ForeignKey_TableName](Foreign_Key_Column)

Arsman Ahmad
sumber
1

Untuk DB2, sintaksnya adalah:

ALTER TABLE one ADD two_id INTEGER FOREIGN KEY (two_id) REFERENCES two (id);
Dan B.
sumber
0

Jika Anda juga perlu menambahkan nilai default jika Anda sudah memiliki beberapa baris dalam tabel kemudian tambahkan DEFAULT val

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

Coba ini:

ALTER TABLE product
ADD FOREIGN KEY (product_ID) REFERENCES product(product_ID);
Michael Alavanyo
sumber
1
Selamat datang di SO! Tolong, komentari jawaban Anda ketika itu hanya kode. Dalam kasus Anda, ada banyak jawaban yang sangat mirip dengan jawaban Anda, jadi jelaskan manfaatnya bagi Anda.
David García Bodego