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.


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.


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)

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)

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

3

Di Oracle :

ALTER TABLE one ADD two_id INTEGER CONSTRAINT Fk_two_id REFERENCES two(id);

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


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)


1

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


1

Untuk DB2, sintaksnya adalah:

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

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

0

Coba ini:

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.