एक कमांड में विदेशी कुंजी बाधा के साथ नया कॉलम जोड़ें


128

मैं एक नया कॉलम जोड़ने की कोशिश कर रहा हूं जो एक विदेशी कुंजी होगी। मैं दो अलग-अलग ALTER TABLEकमांडों का उपयोग करके कॉलम और विदेशी मुख्य बाधा को जोड़ने में सक्षम हूं :

ALTER TABLE one
ADD two_id integer;

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

वहाँ दो के बजाय एक बाद तालिका आदेश के साथ ऐसा करने का एक तरीका है? मैं कुछ भी काम नहीं कर सका।


जवाबों:


185

जैसा कि अक्सर एसक्यूएल-संबंधित प्रश्न के साथ होता है, यह डीबीएमएस पर निर्भर करता है। कुछ DBMS आपको अल्पविराम द्वारा अलग किए गए ALTER तालिका संचालन को संयोजित करने की अनुमति देते हैं। उदाहरण के लिए...

इन्फर्मिक्स सिंटैक्स:

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

IBM DB2 LUW के लिए वाक्यविन्यास समान है, कीवर्ड ADD को दोहरा रहा है (लेकिन अगर मैं सही ढंग से चित्र पढ़ता हूं) तो अतिरिक्त आइटमों को अलग करने के लिए अल्पविराम की आवश्यकता नहीं है।

Microsoft SQL सर्वर सिंटैक्स:

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

कुछ अन्य लोग आपको इस तरह के वैकल्पिक संचालन को संयोजित करने की अनुमति नहीं देते हैं। Standard SQL केवल ALTER TABLE स्टेटमेंट में सिंगल ऑपरेशन की अनुमति देता है, इसलिए Standard SQL में, इसे दो चरणों में करना होता है।


5
दूसरा जोड़ें और बाधा।
इमरान

18
SQL भाग के लिए, बाधा का नाम देने के लिए, आप इसे इस तरह से लिखते हैं: ALTER TABLE [संदेश] ADD [AlertTriggerID] BIGINT NULL, CONSTRAINT FK_Messages_AlTTiggers FOREIGN KEY (AlertTriggerID) REFERENCES AlertTriggers (AlertTriggers) (AlertTriggerID)
ड्रैगोस डर्लुट

78

MS-SQLServer में:

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

यह किस डीबी इंजन के लिए है?
knocte

@knocte यह ms sql सर्वर के लिए है - इस प्रश्न को अब स्पष्ट करने के लिए टैग किया गया है कि
sqladmin

मुझे नहीं लगता कि सवाल को स्पष्ट करने की आवश्यकता है, क्योंकि पहले से ही स्वीकार किए गए उत्तर में कहा गया है कि डीबी इंजन के बीच एक बड़ा अंतर है कि इसे कैसे करें, क्या स्पष्ट किया जाना चाहिए, आपका उत्तर है, इसलिए मैंने बस यही किया
knocte

9
अपने बाधा के नामकरण के लिए। स्वीकृत उत्तर सिस्टम को नाम उत्पन्न करने देता है, जो बाद में प्रबंधित करने के लिए icky और कठिन है।
डर्बी

17

SQL सर्वर के लिए यह कुछ इस तरह होना चाहिए

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

1
यह अन्य उत्तरों की तुलना में थोड़ा अधिक संक्षिप्त है।
सैम

11

में एमएस एसक्यूएल सर्वर:

उपयोगकर्ता परिभाषित विदेशी कुंजी नाम के साथ

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 अद्यतन

यह बहुत पुराना सवाल है, लेकिन लोग अभी भी इसे देख रहे हैं। यदि उपरोक्त उत्तर आपकी मदद नहीं करते हैं, तो सुनिश्चित करें कि आप नए कॉलम के लिए उसी डेटा प्रकार का उपयोग कर रहे हैं जो अन्य तालिका की आईडी है।

मेरे मामले में, मैं लारवेल का उपयोग कर रहा था और मैं अपनी सभी आईडी के लिए "अहस्ताक्षरित पूर्णांक" का उपयोग करता हूं क्योंकि नकारात्मक आईडी एलओएल होने का कोई मतलब नहीं है।

तो उसके लिए, कच्ची 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" होना चाहिए, हाँ?
तैमह

1

आप इसे SQL सर्वर में नीचे की तरह कर सकते हैं

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



1

DB2 के लिए, वाक्यविन्यास है:

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

0

यदि आपको पहले से तालिका में कुछ पंक्तियाँ होने की स्थिति में डिफ़ॉल्ट मान जोड़ने की आवश्यकता है, तो DEFAULT वैल जोड़ें

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
एसओ में आपका स्वागत है! कृपया, अपने उत्तरों की टिप्पणी करें जब वे सिर्फ कोड हों। आपके मामले में, आपके समान कई उत्तर हैं, इसलिए आप के लाभों को उजागर करें।
डेविड गार्सिया बोडेगो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.