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.
sumber
Jawaban:
Lakukan sesuai dengan pembuatan kolom:
Saya telah menggunakan tanda kurung siku daripada tanda kutip karena banyak pembaca tidak akan bekerja
QUOTED_IDENTIFIERS
secara default.sumber
table_constraint
dalam tata bahasa tidak termasukDEFAULT
[load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()
. Perhatikan tanda kurung siku alih-alih tanda kutip ganda.SET QUOTED_IDENTIFIER
matikan. Saya akan merevisi jawabannya, karena saya lebih suka tanda kurung siku, saya baru saja mengikuti gaya pertanyaan OP.