Comment modifier une colonne et changer la valeur par défaut?


195

J'ai eu l'erreur suivante en essayant de modifier le type de données d'une colonne et en définissant une nouvelle valeur par défaut:

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

ERREUR 1064 (42000): vous avez une erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'VARCHAR (255) NOT NULL SET DEFAULT' {} '' à la ligne 1


Je ne pense pas que vous ayez besoin de SET avant DEFAULT
Jonas T

Réponses:


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

Une deuxième possibilité qui fait de même (grâce à juergen_d):

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

9
Le columnest facultatif. Vous pouvez simplement utiliser ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';ou ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';et le résultat sera le même.
kapad

1
C'est la chaîne par défaut que l'OP demandait. Lorsque vous ne spécifiez aucune valeur pour cette colonne lors de l'insertion d'une ligne, la valeur devient {}.
fancyPants

1
Ecrire deux cols l'un à côté de l'autre est-il correct? (comme ça col col)
Shafizadeh

4
@Shafizadeh Oui, ça l'est. Cela offre la possibilité de renommer une colonne. Le premier est le nom d'origine, le second est le nouveau nom.
fancyPants

3
Ne l'utilisez pas si vous devez modifier uniquement la DEFAULTvaleur. Cela traitera toutes les lignes de la table pour rien (très long sur de grandes tables). Utilisez à la place ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>ce qui est instantané.
dolmen

122

En guise de suivi, si vous souhaitez simplement définir une valeur par défaut, vous pouvez certainement utiliser la syntaxe ALTER .. SET. Ne mettez pas toutes les autres choses là-dedans. Si vous voulez mettre le reste de la définition de colonne, utilisez la syntaxe MODIFY ou CHANGE selon la réponse acceptée.

Quoi qu'il en soit, la syntaxe ALTER pour définir une colonne par défaut, (puisque c'est ce que je cherchais quand je suis venu ici):

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

Pour lequel «littéral» pourrait aussi être un nombre (par exemple ...SET DEFAULT 0). Je ne l'ai pas essayé avec ...SET DEFAULT CURRENT_TIMESTAMPmais pourquoi pas hein?


5
De plus, current_timestamp ne fonctionnait pas pour moi s'il était cité. J'ai dû utiliser ce qui suit:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis

7
+1 Meilleure réponse pour moi, car de cette façon je n'ai pas besoin de spécifier le type de colonne et d'autres choses qui ne changeront pas!
user2342558

3
C'est la réponse efficace pour changer uniquement la DEFAULTvaleur.
dolmen

1
Si vous voulez que la valeur par défaut soit l'heure de l'insertion, utilisez NOW()ou current_timestamp()@Malaise @Nereis
BlueCacti

Cela devrait être la réponse acceptée.
Chibueze Opata

19

Si vous souhaitez ajouter une valeur par défaut pour la colonne déjà créée, cela fonctionne pour moi:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0;

3
C'est la meilleure réponse car vous n'avez pas besoin de copier la spécification de champ existante.
rjh

4

Pour 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;

Veuillez noter la déclaration de nom de colonne double

Suppression de DEFAULT CURRENT_TIMESTAMP:

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

Pourquoi doubler les noms de colonnes?
MKJ

2
ALTER TABLE tablename CHANGE COLUMN oldColName newColName columnDefinitions
Leonard Lepadatu

2

La réponse acceptée fonctionne bien.

En cas d' utilisation incorrecte de l' erreur de valeur NULL , sur les valeurs NULL , mettez à jour toutes les valeurs NULL à la valeur par défaut dans cette colonne, puis essayez d'effectuer la modification.

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

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

1
Ce dont j'avais besoin. Merci
arslion

0

Dans le cas où ce qui précède ne fonctionne pas pour vous (par exemple: vous travaillez avec un nouveau SQL ou Azure ), essayez ce qui suit:

1) supprimer la contrainte de colonne existante (le cas échéant):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) créez-en un nouveau:

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

0

Essaye ça

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

comme ça

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.