तालिका बनाते समय एक डिफ़ॉल्ट बाधा की घोषणा


100

मैं GUI का उपयोग करने के बजाय कोड लिखकर Microsoft SQL Server 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 सर्वर एक यादृच्छिक नाम उत्पन्न करेगा, और मैं इसे "पसंद नहीं" करता हूं।

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

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

या

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

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

इसके अलावा, अगर मैं तालिका बनाता हूं और फिर ALTERयह काम करता है:

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


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

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



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


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

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


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

जवाबों:


177

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

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

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


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

3
@Albireo - डिजाइन द्वारा। व्याकरणtable_constraint में शामिल नहीं हैDEFAULT
मार्टिन स्मिथ

2
यह समाधान केवल मेरे लिए काम करता है जब मैं क्षेत्र और बाधा नामों के आसपास के उद्धरण हटाता हूं।
डेविड एस।

1
SQL सर्वर उपयोग के नए संस्करणों के लिए [load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()। डबल कोट्स के बजाय चौकोर कोष्ठकों पर ध्यान दें।
deadlydog 16

3
वास्तव में एक नया / पुराना संस्करण नहीं है - SET QUOTED_IDENTIFIERटॉगल। मैं उत्तर को संशोधित करूंगा, क्योंकि मैं वैसे भी चौकोर कोष्ठक पसंद करता हूं, मैंने ओपी के प्रश्न की शैली का अनुसरण किया था।
डेविड एम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.