2009-11-23 5 views
88

Sto creando una nuova tabella in Microsoft SQL Server 2000 scrivendo il codice anziché utilizzare la GUI, sto cercando di imparare come farlo "in modo manuale".Dichiarazione di un vincolo predefinito durante la creazione di una tabella

Questo è il codice che sto effettivamente usando, e funziona benissimo:

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

Ho specificato la chiave primaria, chiave esterna e verificare i vincoli sul proprio perché in questo modo posso definire un nome per li, altrimenti dichiararli in linea renderebbe SQL Server generare un nome casuale, e non mi piace "mi piace".

Il problema è sorto quando ho cercato di dichiarare il vincolo valore predefinito: guardando le informazioni su internet e come Microsoft SLQ Server Management Studio crea, ho capito che può essere creato sia in linea e sul proprio:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE() 

o

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

il metodo in linea funziona bene, ma genera come al solito un nome casuale per il constaint, il metodo autonomo genera un errore, dicendo Incorrect syntax near 'FOR'..

Inoltre, se creo tavolo e poi ALTER esso, il comando opere:

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


Come riferimento, ecco il codice completo che sto cercando di eseguire:

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



Sono totalmente a perdita qui, è quello che sto cercando di fare non possibile, o sto facendo qualcosa di sbagliato?


Edit:

David M ha mostrato come aggiungere un vincolo predefinito di nome utilizzando la sintassi inline, sto ancora cercando di capire se la sola sintassi di supporto è completamente sbagliato o è colpa mia.

+3

Sono d'accordo con la modifica. La risposta di David M non riguarda come aggiungere un vincolo tramite una dichiarazione di vincolo standalone, ma poiché BOL non ha alcun esempio in cui è possibile nominare il vincolo predefinito * tranne * tramite il modo in cui David M ha dimostrato, penso che sia sicuro presupporre che SQL Server (in modo incoerente) non supporti questa sintassi. –

+1

Vedere anche: [Sintassi non corretta vicino a 'per' SQL Server] (https://stackoverflow.com/questions/42440431/) – paulsm4

risposta

152

Farlo in linea con la creazione della colonna:

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

Ho usato le parentesi quadre invece di citazioni come molti lettori non sono compatibili con QUOTED_IDENTIFIERS di default.

+2

Ctrl-C Ctrl-V - invenzioni meravigliose! –

+3

Grazie, risolve il problema del nome. Ora sto cercando di capire se questo comportamento è "di progettazione" (cioè non è possibile farlo) o se c'è un modo per farlo. Sapete, mi piace mantenere il mio codice "in ordine" e avere i vincoli dichiarati dopo le colonne rende i file SQL più chiari e più facili da capire e correggere (o almeno è ciò che penso). – Albireo

+2

@Albireo - Dalla progettazione. 'table_constraint' in [la grammatica] (http://technet.microsoft.com/en-us/library/ms174979.aspx) non include' DEFAULT' –

Problemi correlati