2013-01-24 35 views
27

बनाएं मैं वर्तमान में है:जोड़ा जा रहा है नाम के एक एसक्यूएल में विदेशी कुंजी की कमी बयान

CREATE TABLE galleries_gallery (
    id    INT NOT NULL PRIMARY KEY IDENTITY, 
    title   NVARCHAR(50) UNIQUE NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL REFERENCES galleries_templates(id), 
    jsAltImgID  INT NOT NULL REFERENCES libraryImage(id) 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0 
); 

लेकिन ऑटो के साथ नाम जो यह मुश्किल बाधा बाद में ड्रॉप करने के लिए कर उत्पन्न इस कमी कहते हैं। बाधाओं का नाम देने के लिए मुझे क्या जोड़ने की ज़रूरत है?

ऊपर के उदाहरण मैं भी PostgreSQL में इसकी जरूरत

+0

[तालिका बनाने] है (http://msdn.microsoft एमएसडीएन से .com/en-us/लाइब्रेरी/ms174979.aspx)। 'rowguid अद्वितीय पहचानकर्ता ROWGUIDCOL न्यूल कंसस्ट्रेंट DF_PurchaseOrderDetail_rowguid DEFAULT (newid()) ' – Hiten004

उत्तर

52

SQL सर्वर में, आप कर सकते हैं विदेशी कुंजी इनलाइन को परिभाषित करने के लिए constraint कीवर्ड का उपयोग करें और उन्हें एक ही समय में नाम दें।

CREATE TABLE galleries_gallery (
    id    INT NOT NULL PRIMARY KEY IDENTITY, 
    title   NVARCHAR(50) UNIQUE NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL 
     CONSTRAINT FK_galerry_template 
     REFERENCES galleries_templates(id), 
    jsAltImgID  INT NOT NULL 
     CONSTRAINT FK_gallery_jsAltImg 
     REFERENCES libraryImage(id) 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0 
); 

मैं सिर्फ एक परीक्षण किए गए और जाहिरा तौर पर एक ही बात भी PostgreSQL में काम करता है:

यहाँ अद्यतन स्क्रिप्ट है http://www.sqlfiddle.com/#!12/2ae29

यहाँ
+1

स्क्लाइट में यह काम करता है। – PaulP

26
CREATE TABLE galleries_gallery (
    id    INT NOT NULL, 
    title   NVARCHAR(50) NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL, 
    jsAltImgID  INT NOT NULL, 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0, 
    CONSTRAINT galleries_gallery_id_pk PRIMARY KEY (id), 
    CONSTRAINT galleries_gallery_title_uk UNIQUE (title), 
    CONSTRAINT galleries_gallery_tmpltid_fk FOREIGN KEY (templateID) REFERENCES galleries_templates (id), 
    CONSTRAINT galleries_gallery_jsAltImgIDfk FOREIGN KEY (isAltImgID) REFERENCES libraryImage (id) 
); 

बाधा नाम निर्दिष्ट करने के लिए बाधा कीवर्ड का प्रयोग करें mssql है। आईएमओ यह क्लीनर है और लाइन के बजाय इस अंत-सारणी को करने के लिए अधिक पठनीय है (दोनों स्वीकार्य हैं, जैसा कि दूसरा उत्तर इंगित करता है), और यह आपको कई स्तंभों पर कई बाधाओं के साथ-साथ कई एफके बनाने की अनुमति देता है एक ही टेबल पर। CONSTRAINT कीवर्ड का उपयोग शून्य के लिए नहीं किया जा सकता है; एक नल बाधा में परिवर्तन के लिए एक वैकल्पिक तालिका संशोधित कॉलम की आवश्यकता है ... शून्य। प्रतिबंध नाम 30 वर्णों से कम या बराबर होना चाहिए। एक मानक नामकरण सम्मेलन का प्रयोग करें। व्यक्तिगत रूप से मैं हमेशा स्तंभ नाम पर प्रीपेड किए गए तालिका नाम का उपयोग करता हूं, जो बाध्यता नाम 30 वर्णों से अधिक है, इसके बाद बाधा प्रकार (पीके, एफके, यूके, इत्यादि)

+0

जबकि मैं देख सकता हूं कि आपका उत्तर साफ है, मैं इस मामले में w0lf का उत्तर लागू कर रहा हूं क्योंकि यह वही है जो मैं ढूंढ रहा हूं। – Rumpleteaser

+7

@LauraHansen बस ध्यान दें कि जब आप कभी बहु-कॉलम बाधाओं की स्थिति में तालिका परिभाषा के अंत में बाधाओं को जोड़ते हैं तो वाक्यविन्यास अधिक लचीला होता है। –

+1

@ AaronBertrand की टिप्पणियों के अनुसार यह अधिक सही उत्तर है। हालांकि, यह ध्यान रखना महत्वपूर्ण है कि कम से कम MSSQL में, बाधा नाम अधिकतम लंबाई 128 वर्ण है। –