Mendeklarasikan batasan default saat membuat tabel

100

Saya membuat tabel baru di Microsoft SQL server 2000 dengan menulis kode alih-alih menggunakan GUI, saya mencoba mempelajari cara melakukannya "dengan cara manual".

Ini adalah kode yang sebenarnya saya gunakan, dan berfungsi dengan baik:

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

Saya telah menentukan kunci utama, kunci asing, dan memeriksa batasan mereka sendiri karena dengan cara ini saya dapat menentukan nama untuk mereka, jika tidak mendeklarasikannya secara inline akan membuat SQL Server menghasilkan nama acak, dan saya tidak "menyukainya".

Masalah muncul ketika saya mencoba mendeklarasikan batasan nilai default: melihat informasi di internet dan bagaimana Microsoft SLQ Server Management Studio membuatnya, saya mengerti bahwa itu dapat dibuat secara inline dan sendiri:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

atau

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

Metode inline berfungsi dengan baik, tetapi menghasilkan seperti biasa nama acak untuk konstanta, metode yang berdiri sendiri melontarkan kesalahan, mengatakan Incorrect syntax near 'FOR'..

Juga, jika saya membuat tabel dan kemudian ALTER, perintahnya berfungsi:

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


Sebagai referensi, berikut adalah kode lengkap yang saya coba jalankan:

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



Saya benar-benar bingung di sini, apakah yang saya coba lakukan tidak mungkin, atau saya melakukan sesuatu yang salah?


Edit:

David M menunjukkan cara menambahkan batasan default bernama menggunakan sintaks sebaris, saya masih mencari untuk memahami apakah sintaks berdiri sendiri benar-benar salah atau itu adalah kesalahan saya.

Albireo
sumber
3
Saya setuju dengan edit. Tanggapan David M tidak mencakup cara menambahkan batasan melalui deklarasi batasan yang berdiri sendiri, tetapi karena BOL tidak memiliki contoh di mana Anda dapat memberi nama batasan default kecuali melalui cara David M menunjukkan, saya pikir aman untuk mengasumsikan SQL Server (tidak konsisten) tidak mendukung sintaks ini.
Peter Majeed

Jawaban:

177

Lakukan sesuai dengan pembuatan kolom:

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

Saya telah menggunakan tanda kurung siku daripada tanda kutip karena banyak pembaca tidak akan bekerja QUOTED_IDENTIFIERSsecara default.

David M
sumber
3
Terima kasih, itu menyelesaikan masalah nama. Sekarang saya mencoba untuk mencari tahu apakah perilaku ini "dengan sengaja" (yaitu tidak mungkin melakukannya) atau jika ada cara untuk melakukannya. Anda tahu, saya suka menjaga kode saya "rapi" dan memiliki batasan yang dideklarasikan setelah kolom membuat file SQL lebih jelas dan lebih mudah untuk dipahami dan debug (atau setidaknya itulah yang saya pikirkan).
Albireo
3
@Albireo - Berdasarkan desain. table_constraintdalam tata bahasa tidak termasukDEFAULT
Martin Smith
2
Solusi ini hanya berfungsi untuk saya ketika saya menghapus tanda kutip di sekitar bidang dan nama batasan.
David S.
1
Untuk versi terbaru dari penggunaan SQL Server [load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE(). Perhatikan tanda kurung siku alih-alih tanda kutip ganda.
deadlydog
3
Sebenarnya bukan versi yang lebih baru / lebih lama - SET QUOTED_IDENTIFIERmatikan. Saya akan merevisi jawabannya, karena saya lebih suka tanda kurung siku, saya baru saja mengikuti gaya pertanyaan OP.
David M