2014-04-04 14 views
17

sto aggiungendo una colonna a una tabella:MySQL aggiungere una colonna NOT NULL

ALTER TABLE t ADD c varchar(10) NOT NULL; 

La colonna viene aggiunto, e ogni record ha la stringa vuota.

Si prevede che funzioni in questo modo in tutte le condizioni (modalità rigorosa, ecc.) In MySQL 5.5+?

+7

sì. Altrimenti sarebbe impossibile aggiungere una nuova colonna a una tabella. Le nuove colonne imposteranno il loro valore come valore predefinito per quella colonna, o il valore appropriato di "default automatico" per il loro tipo. Per un 'varchar not null', questa è una stringa vuota. –

+0

@MarcB, è quello che ho capito. Grazie per la verifica. –

+2

@MarcB, come detto dall'utente2864740, sarebbe perfettamente possibile. Dovresti solo specificare un valore predefinito, che altri DBMS richiedono qui. –

risposta

22

In MySQL, ogni tipo di colonna ha un "implicit default" value.

Per i tipi di stringa [il valore implicito] predefinito è la stringa vuota.

Se una colonna NOT NULL è added to a table, e non viene specificato alcun valore predefinito esplicito, il valore predefinito implicito viene utilizzato per popolare i nuovi dati della colonna . Regole simili si applicano quando viene specificato il valore DEFAULT.

Come tale, l'originale DDL produce gli stessi risultati come:

-- After this, data will be the same, but schema has an EXPLICIT DEFAULT 
ALTER TABLE t ADD c varchar(10) NOT NULL DEFAULT '' 
-- Now we're back to the IMPLICIT DEFAULT (MySQL stores NULL internally) 
ALTER TABLE t ALTER c DROP DEFAULT 

I "severe" Impostazioni del modo colpisce istruzioni DML basandosi su valori di default, ma non influiscono l'utilizzo predefinito implicito quando si aggiunge la colonna .

Per l'inserimento dei dati in una colonna NOT NULL che non ha alcuna clausola DEFAULT esplicita, se un inserire o sostituire dichiarazione include alcun valore per la colonna [e se] la modalità di SQL rigorosa è abilitato, si verifica un errore ..

Ecco an sqlfiddle "proof" che modalità rigorosa non si applica al ALTER TABLE .. Aggiungi dichiarazione.


Questa è una caratteristica di MySQL. Altri motori, come SQL Server, richiedono un vincolo DEFAULT (o NULL) esplicito per tali modifiche dello schema.

Problemi correlati