2009-06-25 24 views
22

Necesito agregar una nueva columna a una base de datos MS SQL 2005 con un valor inicial. Sin embargo, NO quiero crear automáticamente una restricción predeterminada en esta columna. En el momento en que agrego la columna, el valor predeterminado/inicial es correcto, pero esto puede cambiar con el tiempo. Por lo tanto, el acceso futuro a la tabla DEBE especificar un valor en lugar de aceptar un valor predeterminado.¿La mejor manera de agregar una nueva columna con un valor inicial (pero no predeterminado)?

Lo mejor que podía llegar a decir:

ALTER TABLE tbl ADD col INTEGER NULL 
UPDATE tbl SET col = 1 
ALTER TABLE tbl ALTER COLUMN col INTEGER NOT NULL 

esto parece un poco ineficiente para mesas largish (100.000 a 1.000.000 de registros).

He experimentado con agregar la columna con un valor predeterminado y luego eliminar la restricción predeterminada. Sin embargo, no sé cuál es el nombre de la restricción predeterminada y prefiero no acceder a los sysobjects y poner en conocimiento específico de la base de datos.

Por favor, debe haber una mejor manera.

Respuesta

16

me había ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1 primera ,, y soltar los nombrado explícitamente restricción después (presumiblemente dentro de una transacción).

+1

+1. --- @Alex: No estoy seguro de que uno pueda hacer DDL dentro de un trasactions. --- @Adrian: ¿realmente te importa que sea ineficiente? No lo haces todos los días, ¿verdad? Usualmente uso la forma en que describes para mayor claridad. – van

+0

@van, no estoy 100% seguro de las limitaciones de SqlServer'05 a este respecto: PostgreSQL sí le permite alterar la tabla de forma transaccional (con BEGIN explícito y COMPROMISO de la transacción, al menos). Para verificar si MS también lo hace, SELECCIONE @@ TRANCOUNT debe informarle (no puedo encontrarlo claramente explicado en los documentos). –

+0

@van & @Alex MS SQL Server hace DDL dentro de las transacciones. –

1

Puede hacerlo en un desencadenador de inserción

+0

eso es exactamente lo que creo. btw y no desea hacerlo como restricción –

+0

La pregunta es para agregar una columna a una tabla con filas existentes. Agregar un disparador solo afectará las nuevas filas. ¿Me estoy perdiendo de algo? –

+0

Creo que malentendí la pregunta. Cuando dice que desea agregar una columna con un valor inicial, ¿quiere decir que quiere que todas las filas existentes tengan este valor sin tener que actualizarlas? En este caso, puede agregar dos columnas. Una es una columna que admite nulos y la otra es una columna calculada. La columna calculada devolverá el valor predeterminado si la otra columna es nula, de lo contrario devolverá la otra columna. Esta es una gran complejidad en el futuro. Preferiría hacerlo como lo hiciste en tu ejemplo. –

0

Si agrega una restricción predeterminada al crear la tabla, no sabrá cómo se llama. Sin embargo, si agrega una restricción con ALTER TABLE, debe nombrar la restricción. En este caso, usted podría ALTERAR LA RESTRICCIÓN DE LA TOMA DE LA TABLA (Esto se aplica a T-SQL, no está seguro sobre otras bases de datos).

Sin embargo, esto requeriría CREAR TABLA con la columna NULO, ALTERAR TABLA para agregar el restricción, hacer que la columna NOT NULL, y finalmente DROP CONSTRAINT.

No creo que un desencadenador de inserción funcionaría como alguien más lo mencionó, porque sus filas ya están agregadas.

Creo que la forma en que describes puede, de hecho, ser la solución más eficiente y elegante.

11

Para agregar la columna con un valor predeterminado y luego eliminar el defecto, puede nombrar el valor por defecto:

ALTER TABLE tbl ADD col INTEGER NOT NULL CONSTRAINT tbl_temp_default DEFAULT 1 
ALTER TABLE tbl drop constraint tbl_temp_default 

Esta lleno en el valor 1, pero deja la mesa sin un defecto. Al usar SQL Server 2008, ejecuté este y su código, de alter update alter y no vi ninguna diferencia notable en una tabla de 100.000 filas pequeñas. SSMS no me mostró los planes de consulta para las declaraciones de la tabla alter, por lo que no pude comparar los recursos utilizados entre los dos métodos.

Cuestiones relacionadas