inserire una colonna NOT NULL in una tabella esistente


121

Ho provato:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Ma dà questo messaggio di errore:

ALTER TABLE consente solo di aggiungere colonne che possono contenere valori null o avere una definizione DEFAULT specificata

Risposte:


222

Come opzione puoi inizialmente creare una colonna Null-grado, quindi aggiornare la colonna della tabella con valori non nulli validi e infine la colonna ALTER per impostare il 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 è specificare il valore predefinito corretto per la colonna:

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

UPD: Tieni presente che la risposta sopra contiene GOche è un must quando esegui questo codice su Microsoft SQL Server. Se vuoi eseguire la stessa operazione su Oracle o MySQL devi usare il punto ;e virgola in questo modo:

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 hai valori che puoi inserire nel campo manualmente. In questo modo non devi preoccuparti di creare ed eliminare un vincolo predefinito in cui non ne hai bisogno.
Mark W Dickson

1
@acarlon - Penso che stia raggiungendo. L' updateaffermazione pericolosa di cui parli sarebbe dannosa in qualsiasi domanda. Dovrebbe essere abbastanza semplice vedere se hai una colonna in più nella updatedichiarazione qui. In genere aggiungeresti solo una o due colonne alla volta. Se ti capita di aggiungere una colonna in più nella tua updatedichiarazione che non appartiene a lì, in questo esempio, forse non dovresti essere responsabile dei dati in primo luogo.
Mark W Dickson

1
ANDROID Gli sviluppatori che utilizzano SQLite devono essere consapevoli che ALTER COLUMNNON è supportato in SQLite.
Sdghasemi

2
Non l'ho mai visto GOprima e sembra non essere una parte della specifica SQL , quindi probabilmente porterà a un errore per gli script che non vengono eseguiti da uno degli strumenti che lo supportano. Usa solo il punto e virgola? Non consiglio di diffondere gli standard Microsoft in quanto raramente si preoccupano di uno standard stabilito e ragionevole, ma se ne inventano uno proprio per averne inventato uno proprio. A parte questo, risposta utile.
Neonit

2
@Neon grazie per il commento, ma la domanda originale riguardava il server MS SQL, ecco perché GO è lì. Ma aggiungerò una nota a riguardo alla mia risposta.
Pavel Morshenyuk,

13

Se non si consente alla colonna di essere 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

Su Enterprise Edition si tratta di una modifica solo ai metadati dal 2012


2
Non è necessario , ma è un'opzione.
Matt

6

Il messaggio di errore è abbastanza descrittivo, prova:

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

e qual è il significato del "meno" nella parte predefinita?
Mladen B.

3

Altre implementazioni SQL hanno limitazioni simili. Il motivo è che l'aggiunta di una colonna richiede l'aggiunta di valori per quella colonna (logicamente, anche se non fisicamente), che per impostazione predefinita sono NULL. Se non lo permetti NULLe non hai un default, quale sarà il valore?

Poiché SQL Server supporta ADD CONSTRAINT, consiglierei l'approccio di Pavel di creare una colonna nullable e quindi aggiungere un NOT NULLvincolo dopo averlo riempito con NULLvalori non validi.


MySQL supporta l'aggiunta di colonne non nulle nella tabella esistente con i dati, dove il valore vuoto "sensato" per il tipo di dati viene fornito nelle righe esistenti (es. 0,0 per float, 0 per intero, stringa vuota per stringa, ecc.).
Michael Tsang

2

Questo ha funzionato per me, può anche essere "preso in prestito" dalla vista progettazione, apportare modifiche -> fare clic con il tasto destro -> generare script di modifica.

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

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

0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"

1
Cosa aggiunge questa risposta a questo argomento?
barbsan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.