การประกาศข้อ จำกัด เริ่มต้นเมื่อสร้างตาราง


100

ฉันกำลังสร้างตารางใหม่ใน Microsoft SQL Server 2000 โดยเขียนโค้ดแทนการใช้ GUI ฉันกำลังพยายามเรียนรู้วิธีการทำ "วิธีการด้วยตนเอง"

นี่คือรหัสที่ฉันใช้จริงและใช้งานได้ดี:

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 Server สร้างชื่อแบบสุ่มและฉันไม่ "ชอบ"

ปัญหาเกิดขึ้นเมื่อฉันพยายามประกาศข้อ จำกัด ของค่าเริ่มต้น: ดูข้อมูลบนอินเทอร์เน็ตและวิธีที่ Microsoft SLQ Server Management Studio สร้างขึ้นฉันเข้าใจว่าสามารถสร้างได้ทั้งแบบอินไลน์และในตัวเอง:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

หรือ

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

วิธีการแบบอินไลน์ทำงานได้ดี แต่มันก็สร้างตามปกติชื่อสุ่มสำหรับ constaint 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"
)



ฉันสูญเสียที่นี่โดยสิ้นเชิงคือสิ่งที่ฉันพยายามทำไม่ได้หรือฉันทำอะไรผิด?


แก้ไข:

David M แสดงวิธีเพิ่มข้อ จำกัด เริ่มต้นที่มีชื่อโดยใช้ไวยากรณ์แบบอินไลน์ฉันยังคงต้องการทำความเข้าใจว่าไวยากรณ์แบบสแตนด์อะโลนนั้นผิดทั้งหมดหรือเป็นความผิดของฉัน


3
ฉันเห็นด้วยกับการแก้ไข การตอบสนองของ David M ไม่ครอบคลุมถึงวิธีการเพิ่มข้อ จำกัด ผ่านการประกาศข้อ จำกัด แบบสแตนด์อะโลน แต่เนื่องจาก BOL ไม่มีตัวอย่างใด ๆ ที่คุณสามารถตั้งชื่อข้อ จำกัด เริ่มต้นยกเว้นวิธีที่ David M สาธิตฉันคิดว่าปลอดภัยที่จะถือว่า SQL เซิร์ฟเวอร์ (ไม่สอดคล้องกัน) ไม่รองรับไวยากรณ์นี้
Peter Majeed

คำตอบ:


177

ทำควบคู่ไปกับการสร้างคอลัมน์:

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

ฉันใช้วงเล็บเหลี่ยมมากกว่าเครื่องหมายคำพูดเนื่องจากผู้อ่านหลายคนใช้ไม่ได้QUOTED_IDENTIFIERSโดยค่าเริ่มต้น


3
ขอบคุณที่ช่วยแก้ปัญหาชื่อ ตอนนี้ฉันกำลังพยายามคิดว่าพฤติกรรมนี้ "โดยการออกแบบ" (กล่าวคือไม่สามารถทำได้) หรือมีวิธีที่จะทำได้ คุณรู้ไหมว่าฉันต้องการให้รหัสของฉัน "เป็นระเบียบ" และมีการประกาศข้อ จำกัด หลังคอลัมน์ทำให้ไฟล์ SQL ชัดเจนและเข้าใจง่ายขึ้นและดีบัก (หรืออย่างน้อยก็เป็นอย่างที่ฉันคิด)
Albireo

3
@Albireo - โดยการออกแบบ table_constraintในไวยากรณ์ไม่รวมDEFAULT
Martin Smith

2
วิธีนี้ใช้ได้เฉพาะกับฉันเมื่อฉันลบเครื่องหมายคำพูดรอบฟิลด์และชื่อข้อ จำกัด
David S.

1
[load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()สำหรับรุ่นใหม่ของการใช้ SQL Server สังเกตวงเล็บเหลี่ยมแทนเครื่องหมายคำพูดคู่
Deadlydog

3
ไม่ใช่สิ่งที่ใหม่กว่า / เก่ากว่า - SET QUOTED_IDENTIFIERสลับ ฉันจะแก้ไขคำตอบเนื่องจากฉันชอบวงเล็บเหลี่ยมอยู่แล้วฉันเพิ่งทำตามรูปแบบของคำถามของ OP
David M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.