Khai báo một ràng buộc mặc định khi tạo bảng


100

Tôi đang tạo một bảng mới trong Microsoft SQL server 2000 bằng cách viết mã thay vì sử dụng GUI, tôi đang cố gắng tìm hiểu cách thực hiện "theo cách thủ công".

Đây là mã tôi thực sự đang sử dụng và nó hoạt động tốt:

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

Tôi đã chỉ định khóa chính, khóa ngoại và kiểm tra các ràng buộc của riêng chúng vì bằng cách này tôi có thể xác định tên cho chúng, nếu không việc khai báo chúng nội tuyến sẽ khiến SQL Server tạo ra một tên ngẫu nhiên và tôi không "thích" nó.

Vấn đề nảy sinh khi tôi cố gắng khai báo ràng buộc giá trị mặc định: xem thông tin trên internet và cách Microsoft SLQ Server Management Studio tạo nó, tôi hiểu rằng nó có thể được tạo cả nội tuyến và riêng nó:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

hoặc là

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

Phương thức nội tuyến hoạt động tốt, nhưng nó tạo ra một tên ngẫu nhiên như bình thường cho hằng số, phương thức độc lập sẽ tạo ra một lỗi Incorrect syntax near 'FOR'..

Ngoài ra, nếu tôi tạo bảng và sau đó ALTERnó, lệnh sẽ hoạt động:

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


Để tham khảo, đây là mã đầy đủ mà tôi đang cố gắng thực thi:

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



Tôi hoàn toàn thua thiệt ở đây, có phải điều tôi đang cố gắng không thể thực hiện được hay tôi đang làm sai điều gì đó?


Biên tập:

David M đã chỉ ra cách thêm một ràng buộc mặc định được đặt tên bằng cú pháp nội tuyến, tôi vẫn đang tìm hiểu xem cú pháp độc lập có hoàn toàn sai hay đó là lỗi của tôi.


3
Tôi đồng ý với bản chỉnh sửa. Phản hồi của David M không đề cập đến cách thêm ràng buộc thông qua khai báo ràng buộc độc lập, nhưng vì BOL không có bất kỳ ví dụ nào mà bạn có thể đặt tên cho ràng buộc mặc định ngoại trừ thông qua cách David M đã trình bày, tôi nghĩ rằng sẽ an toàn khi giả sử SQL Máy chủ (không nhất quán) không hỗ trợ cú pháp này.
Peter Majeed

Câu trả lời:


177

Làm điều đó nội dòng với việc tạo cột:

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

Tôi đã sử dụng dấu ngoặc vuông thay vì dấu ngoặc kép vì nhiều trình đọc sẽ không làm việc với QUOTED_IDENTIFIERStheo mặc định.


3
Cảm ơn, điều đó giải quyết được vấn đề về tên. Bây giờ tôi đang cố gắng tìm hiểu xem hành vi này là "theo thiết kế" (tức là không thể thực hiện được) hoặc nếu có một cách để thực hiện. Bạn biết đấy, tôi muốn giữ cho mã của mình "gọn gàng" và có các ràng buộc được khai báo sau các cột làm cho các tệp SQL rõ ràng hơn, dễ hiểu hơn và gỡ lỗi (hoặc ít nhất đó là những gì tôi nghĩ).
Albireo

3
@Albireo - Theo thiết kế. table_constrainttrong ngữ pháp không bao gồmDEFAULT
Martin Smith

2
Giải pháp này chỉ hoạt động đối với tôi khi tôi loại bỏ các dấu ngoặc kép xung quanh trường và tên ràng buộc.
David S.

1
Đối với các phiên bản SQL Server mới hơn, sử dụng [load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE(). Chú ý dấu ngoặc vuông thay vì dấu ngoặc kép.
deaddog

3
Không thực sự là một thứ phiên bản mới hơn / cũ hơn - SET QUOTED_IDENTIFIERchuyển đổi. Tôi sẽ sửa lại câu trả lời, vì dù sao thì tôi cũng thích dấu ngoặc vuông hơn, tôi vừa mới làm theo kiểu câu hỏi của OP.
David M
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.