valor restriccion por permitir defecto con columna check campo alterar agregar sql sql-server database alter-table

restriccion - permitir null sql server



¿La mejor manera de agregar una nueva columna con un valor inicial(pero no predeterminado)? (4)

Me gustaría ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1 primero, y eliminar la restricción explícitamente nombrada después (probablemente dentro de una transacción).

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.

Lo mejor que se me ocurre es:

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 tablas grandes (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 preferiría no acceder a sysobjects y poner conocimiento específico de la base de datos.

Por favor, debe haber una mejor manera.


Para agregar la columna con un valor predeterminado y luego eliminar el valor predeterminado, puede asignar un nombre al valor predeterminado:

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

Esto completó el valor 1, pero deja la tabla sin un valor predeterminado. Usando 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 mostraría los planes de consulta para las declaraciones de alterar la tabla, por lo que no pude comparar los recursos utilizados entre los dos métodos.


Puedes hacerlo en un disparador de inserción.


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 asignar un nombre a la restricción. En este caso, podría ALTERAR LA TABLA PARA APROVECHAR LA RESTRICCIÓN (Esto se aplica a T-SQL, no estoy seguro acerca de otras bases de datos).

Sin embargo, esto requeriría que CREAR TABLA con una columna NULA, ALTERAR MESA para agregar la restricción, hacer que la columna NO sea NULA y, finalmente, SALIR de RESTRICCIÓN.

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

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