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.
+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
@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). –
@van & @Alex MS SQL Server hace DDL dentro de las transacciones. –