Devo aggiungere una nuova colonna a un database MS SQL 2005 con un valore iniziale. Tuttavia, NON voglio creare automaticamente un vincolo predefinito su questa colonna. Nel momento in cui aggiungo la colonna il valore predefinito/iniziale è corretto, ma questo può cambiare nel tempo. Quindi, l'accesso futuro alla tabella DEVE specificare un valore invece di accettare un valore predefinito.Il modo migliore per aggiungere una nuova colonna con un valore iniziale (ma non predefinito)?
Il meglio che ho potuto venire in mente è:
ALTER TABLE tbl ADD col INTEGER NULL
UPDATE tbl SET col = 1
ALTER TABLE tbl ALTER COLUMN col INTEGER NOT NULL
Questo sembra un po 'inefficiente per tavoli abbastanza grande (da 100.000 a 1.000.000 record).
Ho sperimentato l'aggiunta della colonna con un valore predefinito e quindi l'eliminazione del vincolo predefinito. Tuttavia, non so quale sia il nome del vincolo predefinito e preferisco non accedere agli sysobjects e inserire conoscenze specifiche del database.
Per favore, ci deve essere un modo migliore.
+1. --- @Alex: non sono sicuro che si possa fare DDL all'interno di una transazione. --- @Adrian: ti interessa davvero che sia inefficiente? Non lo fai tutti i giorni, vero? Di solito uso il modo in cui descrivi per chiarezza. – van
@van, non sono sicuro al 100% delle limitazioni di SqlServer'05 a questo proposito - PostgreSQL ti consente di modificare la tabella in modo transazionale (con BEGIN e COMMIT espliciti della transazione, almeno). Per verificare se anche MS lo fa, SELECT @@ TRANCOUNT dovrebbe dirti (non riesco a trovarlo chiaramente nei documenti). –
@van & @Alex MS SQL Server esegue DDL all'interno delle transazioni. –