2009-11-23 9 views
88

Estoy creando una nueva tabla en Microsoft SQL Server 2000 escribiendo el código en lugar de usar la GUI, estoy intentando aprender a hacerlo "de la manera manual".Declarar una restricción predeterminada al crear una tabla

Este es el código que estoy utilizando realmente, y funciona bien:

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

he especificado la clave primaria, clave externa y las restricciones de comprobación por su cuenta, porque de esta manera puedo definir un nombre para ellos, de lo contrario, declararlos en línea haría que SQL Server generara un nombre aleatorio, y no me gusta.

El problema surgió cuando trataba de declarar el valor por defecto restricción: mirando las informaciones en Internet y cómo Microsoft SLQ Server Management Studio crea, entendí que se puede crear tanto en línea como en su propia:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE() 

o

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

el método en línea funciona bien, pero como de costumbre genera un nombre aleatorio para el constaint, el método independiente genera un error, diciendo Incorrect syntax near 'FOR'..

Además, si se crea la tabla y luego ALTER él, el comando funciona:

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


Como referencia, aquí está el código completo que estoy tratando de ejecutar:

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



Estoy totalmente en la pérdida aquí, es lo que estoy tratando de hacer que no sea posible, o estoy haciendo algo mal?


Editar:

David M mostró cómo agregar una restricción predeterminada llamada utilizando la sintaxis de línea, todavía estoy buscando entender si la sola sintaxis soporte está completamente equivocado o es mi culpa.

+3

Acepto la edición. La respuesta de David M no cubre cómo agregar una restricción a través de una declaración de restricción independiente, pero como BOL no tiene ningún ejemplo donde se pueda nombrar la restricción predeterminada * excepto * por la forma en que David M lo demostró, creo que es seguro supongamos que SQL Server (de manera incoherente) no admite esta sintaxis. –

+1

Vea también: [Sintaxis incorrecta cerca de 'para' SQL Server] (https://stackoverflow.com/questions/42440431/) – paulsm4

Respuesta

152

Hágalo en línea con la creación de la columna:

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

he utilizado corchetes en vez de comillas como muchos lectores no funcionarán con QUOTED_IDENTIFIERS de forma predeterminada.

+2

Ctrl-C Ctrl-V - invenciones maravillosas! –

+3

Gracias, eso resuelve el problema del nombre. Ahora estoy tratando de averiguar si este comportamiento es "por diseño" (es decir, no es posible hacerlo) o si hay una manera de hacerlo. Ya sabes, me gusta mantener mi código "ordenado" y tener las restricciones declaradas después de las columnas hace que los archivos SQL sean más claros y fáciles de comprender y depurar (o al menos eso es lo que creo). – Albireo

+2

@Albireo - Por diseño. 'table_constraint' en [la gramática] (http://technet.microsoft.com/en-us/library/ms174979.aspx) no incluye' DEFAULT' –

Cuestiones relacionadas