2010-08-16 7 views

risposta

162

Come opzione, è possibile creare inizialmente la colonna Null-capable, quindi aggiornare la colonna della tabella con valore non nullo valido s ed infine modificare la colonna per impostare vincolo NOT NULL:

ALTER TABLE MY_TABLE ADD STAGE INT NULL 
GO 
UPDATE MY_TABLE SET <a valid not null values for your column> 
GO 
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL 
GO 

Un'altra opzione è quella di specificare il valore predefinito corretto per la colonna:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0' 

UPD: Si prega di notare che la risposta di cui sopra contiene GO che è un must quando si esegue questo codice sul server Microsoft SQL. Se si desidera eseguire la stessa operazione su Oracle o MySQL è necessario utilizzare il punto e virgola ; così:

ALTER TABLE MY_TABLE ADD STAGE INT NULL; 
UPDATE MY_TABLE SET <a valid not null values for your column>; 
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL; 
+1

Personalmente preferisco il primo modo qui se si dispone di valori che è possibile inserire nel campo manualmente. In questo modo non devi preoccuparti di creare ed eliminare un vincolo predefinito in cui non ne hai bisogno. –

+0

@MarkWDickson - Il primo sembra più pericoloso per me. Cosa succede se la colonna sbagliata scivolato in istruzione SET: UPDATE MY_TABLE SET Employee_Salary = 0 – acarlon

+1

@acarlon - penso che è di raggiungere. La pericolosa dichiarazione di "aggiornamento" da te menzionata sarebbe dannosa in qualsiasi query. Dovrebbe essere abbastanza semplice da vedere se hai una colonna in più nell'istruzione 'update' qui. In genere si aggiungono solo una colonna o due alla volta. Se ti capita di aggiungere una colonna in più all'istruzione 'update' che non vi appartiene, in questo esempio, forse non dovresti essere responsabile dei dati in primo luogo. –

4

Il messaggio di errore è abbastanza descrittiva, provare:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-'; 
+0

e qual è il significato del "meno" nella parte di default? –

11

Se non consente la colonna da Null è necessario fornire un valore predefinito per popolare le righe esistenti. per esempio.

ALTER TABLE dbo.YourTbl ADD 
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0 

On Enterprise Edition Si tratta di un metadata only change dal 2012

+1

Non * è necessario *, ma è un'opzione. – Matt

1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`; 
3

Other SQL implementations have similar restrictions. La ragione è che l'aggiunta di una colonna richiede l'aggiunta di valori per quella colonna (logicamente, anche se non fisicamente), che di default NULL . Se non permettere NULL, e non hanno un default, qual è il valore sta per essere?

Poiché SQL Server supporta ADD CONSTRAINT, io consiglierei l'approccio di Pavel di creare una colonna Null, e quindi l'aggiunta di un vincolo NOT NULL dopo aver riempito con non NULL valori.

2

questo ha funzionato per me, può anche essere "preso in prestito" dal punto di vista di design, apportare modifiche -> tasto destro -> generare script di cambiamento.

BEGIN TRANSACTION 
GO 
ALTER TABLE dbo.YOURTABLE ADD 
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0 
GO 
COMMIT