Bir komutta yabancı anahtar kısıtlaması olan yeni sütun ekleyin


128

Yabancı anahtar olacak yeni bir sütun eklemeye çalışıyorum. İki ayrı ALTER TABLEkomut kullanarak sütunu ve yabancı anahtar kısıtlamasını ekleyebildim :

ALTER TABLE one
ADD two_id integer;

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

Bunu iki yerine bir ALTER TABLE komutuyla yapmanın bir yolu var mı? İşe yarayan hiçbir şey bulamadım.


Yanıtlar:


185

SQL ile ilgili soruda sıklıkla olduğu gibi, bu DBMS'ye bağlıdır. Bazı DBMS, ALTER tablo işlemlerini virgülle ayırarak birleştirmenize izin verir. Örneğin...

Informix sözdizimi:

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

IBM DB2 LUW için sözdizimi benzerdir, ADD anahtar sözcüğünü tekrar eder, ancak (şemayı doğru okursam) eklenen öğeleri ayırmak için virgül gerektirmez.

Microsoft SQL Server sözdizimi:

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

Bazıları, ALTER TABLE işlemlerini bu şekilde birleştirmenize izin vermez. Standart SQL, ALTER TABLE deyiminde yalnızca tek bir işleme izin verir, bu nedenle Standart SQL'de, iki adımda yapılması gerekir.


5
İkinci Ekleme ve kısıtlama.
Imran

18
SQL bölümü için, kısıtlamaya isim vermek için şu şekilde yazarsınız: ALTER TABLE [Mesajlar] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlertTriggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggerID);
Dragos Durlut

78

MS-SQLServer'da:

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

Bu hangi DB motoru için?
2016

@knocte ms sql sunucusu içindir - soru şimdi bunu açıklığa kavuşturmak için etiketlendi
sqladmin

Kabul edilen cevap, DB motorları arasında nasıl yapılacağı konusunda büyük bir fark olduğunu belirttiğinden, sorunun açıklığa kavuşturulması gerektiğini sanmıyorum, açıklığa kavuşturulması gereken cevabınız, bu yüzden bunu az önce yaptım
knocte

9
Kısıtlamanızı adlandırmak için. Kabul edilen yanıt, sistemin daha sonra yönetilmesi zor ve zor olan adı oluşturmasını sağlar.
Derpy

17

SQL Server için şöyle bir şey olmalıdır

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

1
Bu, diğer cevaplardan biraz daha özlü.
Sam

11

In MS SQL SERVER:

Kullanıcı tanımlı yabancı anahtar adı ile

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

Kullanıcı tanımlı yabancı anahtar adı olmadan

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

3

In Oracle :

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

2

2020 Güncellemesi

Oldukça eski bir soru ama insanlar hala ona dönüyorlar. Yukarıdaki cevaplar size yardımcı olmadıysa, yeni sütun için diğer tablonun kimliği ile aynı veri türünü kullandığınızdan emin olun.

Benim durumumda, Laravel kullanıyordum ve tüm kimliklerim için "işaretsiz tamsayı" kullanıyorum çünkü negatif id LOL'ye sahip olmanın bir anlamı yok.

Bunun için ham SQL sorgusu şu şekilde değişecektir:

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

Umut ediyorum bu yardım eder


1
"KISITLAMA EKLE" sadece "KISITLAMA" olmalıdır, evet?
TimH

1

SQL Server'da aşağıdaki gibi yapabilirsiniz

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

DB2 için sözdizimi şöyledir:

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

0

Tabloda zaten bazı satırlarınız olması durumunda varsayılan değerleri de eklemeniz gerekiyorsa, VARSAYILAN val ekleyin

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

0

Bunu dene:

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

1
SO'ya hoş geldiniz! Lütfen cevaplarınızı sadece kod olduklarında yorumlayınız. Sizin durumunuzda, sizinkine oldukça benzeyen birçok cevap var, bu yüzden kendi yararlarınızı ortaya çıkarın.
David García Bodego
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.