Come modificare una colonna e modificare il valore predefinito?


190

Ho riscontrato il seguente errore durante il tentativo di modificare il tipo di dati di una colonna e l'impostazione di un nuovo valore predefinito:

ALTER TABLE foobar_data ALTER COLUMN col VARCHAR(255) NOT NULL SET DEFAULT '{}';

ERRORE 1064 (42000): si è verificato un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'VARCHAR (255) NOT NULL SET DEFAULT' {} '' alla riga 1


Non credo che tu abbia bisogno di SET prima di DEFAULT
Jonas T

Risposte:


274
ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

Una seconda possibilità che fa lo stesso (grazie a juergen_d):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';

9
Il columnè opzionale. Potresti semplicemente usare ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';o ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';e il risultato sarà lo stesso.
Kapad,

1
È la stringa predefinita richiesta dall'OP. Quando non si specifica alcun valore per questa colonna quando si inserisce una riga, il valore diventa {}.
fancyPants

1
Scrivere due cols uno accanto all'altro è corretto? (come questo col col)
Shafizadeh,

4
@Shafizadeh Sì, lo è. Ciò offre la possibilità di rinominare una colonna. Il primo è il nome originale, il secondo è il nuovo nome.
fancyPants

3
Non utilizzarlo se è necessario modificare solo il DEFAULTvalore. Questo non elaborerà tutte le righe della tabella per niente (molto lungo su enormi tabelle). Usa invece ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>quale è istantaneo.
dolmen,

114

Come follow-up, se si desidera solo impostare un valore predefinito, è abbastanza sicuro che è possibile utilizzare la sintassi ALTER .. SET. Basta non mettere tutte le altre cose lì dentro. Se inserirai il resto della definizione di colonna, usa la sintassi MODIFY o CHANGE secondo la risposta accettata.

Comunque, la sintassi ALTER per l'impostazione di una colonna di default, (poiché è quello che stavo cercando quando sono arrivato qui):

ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT 'literal';

Per cui 'letterale' potrebbe anche essere un numero (ad esempio ...SET DEFAULT 0). Non l'ho provato, ...SET DEFAULT CURRENT_TIMESTAMPma perché non eh?


5
Anche current_timestamp non funzionava per me se citato. Ho dovuto usare quanto segue:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis,

7
+1 La migliore risposta per me, perché in questo modo non ho bisogno di specificare il tipo di colonna e altre cose che non cambieranno!
user2342558

2
Questa è la risposta efficace per modificare solo il DEFAULTvalore.
dolmen,

1
Se si desidera che il valore predefinito sia l'ora dell'inserimento, utilizzare NOW()o current_timestamp()@Malaise @Nereis
BlueCacti

16

Se vuoi aggiungere il valore predefinito per la colonna già creata, questo funziona per me:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';

2
Questa è la risposta migliore in quanto non è necessario copiare le specifiche del campo esistente.
RJ

4

Per DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 CHANGE COLUMN columnname1 columname1 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 CHANGE COLUMN columnname2 columname2 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Nota la dichiarazione con doppio nome di colonna

Rimozione di DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;

Perché i nomi a doppia colonna?
MKJ,

2
ALTER TABLE tablename CAMBIA COLONNA oldColName newColName columnDefinitions
Leonard Lepadatu

1

La risposta accettata funziona bene.

In caso di utilizzo non valido dell'errore valore NULL , sui valori NULL , aggiornare tutti i valori null al valore predefinito in quella colonna e quindi provare a fare la modifica.

UPDATE foobar_data SET col = '{}' WHERE col IS NULL;

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

Quello di cui avevo bisogno. Grazie
arslion il

0

Nel caso in cui quanto sopra non funziona per te (ovvero: stai lavorando con un nuovo SQL o Azure ) prova quanto segue:

1) elimina il vincolo di colonna esistente (se presente):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) creane uno nuovo:

ALTER TABLE [table_name] ADD CONSTRAINT DF_my_constraint  DEFAULT getdate() FOR column_name;

0

Prova questo

ALTER TABLE `table_name` CHANGE `column_name` `column_name` data_type  NULL DEFAULT '';

come questo

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
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.