2009-11-23 10 views
88

मैं जीयूआई का उपयोग करने के बजाय कोड लिखकर माइक्रोसॉफ्ट एसक्यूएल सर्वर 2000 में एक नई तालिका बना रहा हूं, मैं इसे "मैन्युअल तरीका" कैसे करना सीखने की कोशिश कर रहा हूं।तालिका बनाते समय एक डिफ़ॉल्ट बाधा घोषित करना

इस कोड को मैं वास्तव में उपयोग कर रहा हूँ है, और यह ठीक काम करता है:

CREATE TABLE "attachments" 
(
    "attachment_id" INT NOT NULL, 
    "load_date" SMALLDATETIME NOT NULL, 
    "user" VARCHAR(25) NOT NULL, 
    "file_name" VARCHAR(50) NOT NULL, 
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"), 
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"), 
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE()) 
) 

मैं प्राथमिक कुंजी, विदेशी कुंजी निर्दिष्ट और अपने दम पर की कमी की जांच की है क्योंकि इस तरह से मैं के लिए एक नाम परिभाषित कर सकते हैं उन्हें, अन्यथा इनलाइन घोषित करने से SQL सर्वर एक यादृच्छिक नाम उत्पन्न करेगा, और मुझे इसे "पसंद नहीं है"।

समस्या तब पैदा हुआ जब मैं डिफ़ॉल्ट मान बाधा घोषित करने की कोशिश: इंटरनेट और कैसे माइक्रोसॉफ्ट SLQ सर्वर प्रबंधन स्टूडियो यह बनाता है पर जानकारियां को देखते हुए, मैं समझ गया कि यह दोनों इनलाइन बनाया जा सकता है और अपने दम पर:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE() 

या

CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date" 

इनलाइन विधि ठीक काम करता है, लेकिन यह constaint के लिए हमेशा की तरह एक यादृच्छिक नाम के रूप में उत्पन्न करता है, अकेले खड़े विधि Incorrect syntax near 'FOR'. कह एक त्रुटि फेंकता है,।

इसके अलावा

, अगर मैं मेज और फिर ALTER बनाने यह कमांड काम करता है:

CREATE TABLE "attachments" 
(
    "attachment_id" INT NOT NULL, 
    "load_date" SMALLDATETIME NOT NULL, 
    "user" VARCHAR(25) NOT NULL, 
    "file_name" VARCHAR(50) NOT NULL, 
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"), 
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"), 
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE()), 
    CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date" 
) 
:

ALTER TABLE "attachments" 
ADD CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date" 


एक संदर्भ के रूप में, यहाँ पूर्ण कोड मैं निष्पादित करने के लिए कोशिश कर रहा हूँ है



मैं पूरी तरह से यहां नुकसान पहुंचा रहा हूं, क्या मैं संभव नहीं कर रहा हूं, या मैं कुछ गलत कर रहा हूं?


संपादित करें:

डेविड एम इनलाइन सिंटैक्स का उपयोग किसी नामित डिफ़ॉल्ट बाधा जोड़ने के बारे में पता चला, मैं अभी भी समझने के लिए करता है, तो अकेले खड़े वाक्य रचना पूरी तरह से गलत है देख रहा हूँ या यह मेरी गलती है।

+3

मैं संपादन से सहमत हूं। डेविड एम की प्रतिक्रिया में स्टैंड-अलोन बाधा घोषणा के माध्यम से बाधा डालने का तरीका शामिल नहीं है, लेकिन चूंकि बीओएल में कोई उदाहरण नहीं है, जहां आप डिफॉल्ट बाधा का नाम दे सकते हैं * सिवाय इसके कि * डेविड एम के प्रदर्शन के माध्यम से, मुझे लगता है कि यह सुरक्षित है मान लें कि SQL सर्वर (असंगत रूप से) इस वाक्यविन्यास का समर्थन नहीं करता है। –

+1

यह भी देखें: ['SQL सर्वर के लिए' के ​​पास गलत वाक्यविन्यास] (https://stackoverflow.com/questions/42440431/) – paulsm4

उत्तर

152

यह इनलाइन करो स्तंभ निर्माण के साथ:

[load_date] SMALLDATETIME NOT NULL 
     CONSTRAINT [df_load_date] DEFAULT GETDATE() 

मैं उद्धरण के बजाय वर्ग कोष्ठक का इस्तेमाल किया है के रूप में कई पाठकों डिफ़ॉल्ट रूप से चालू QUOTED_IDENTIFIERS साथ काम नहीं करेंगे।

+2

Ctrl-C Ctrl-V - अद्भुत आविष्कार! –

+3

धन्यवाद, जो नाम की समस्या का समाधान करता है। अब मैं यह पता लगाने की कोशिश कर रहा हूं कि यह व्यवहार "डिज़ाइन द्वारा" है (यानी यह करना संभव नहीं है) या यदि ऐसा करने का कोई तरीका है। आप जानते हैं, मैं अपना कोड "साफ" रखना चाहता हूं और कॉलम के बाद कॉल की गई बाधाओं को स्पष्ट और आसान समझने और डीबग करने के लिए आसान बनाता है (या कम से कम यह मुझे लगता है)। – Albireo

+2

@Albireo - डिज़ाइन द्वारा। [व्याकरण] में 'table_constraint') (http://technet.microsoft.com/en-us/library/ms174979.aspx) में 'DEFAULT' –

संबंधित मुद्दे