Comment changer le type de données d'une colonne dans MySQL?

489

Je veux changer le type de données de plusieurs colonnes de float à int. Quelle est la manière la plus simple de procéder?

Il n'y a pas encore de données à craindre.

Eric Wilson
la source
6
Juste pour rendre cela explicite, les réponses ci-dessous (en utilisant ALTER TABLE) fonctionneront, en fait, même si la colonne contient déjà des données. Cependant, la conversion d'une colonne flottante en une colonne entière entraînera l'arrondissement de toutes les valeurs non entières à l'entier le plus proche.
Ilmari Karonen

Réponses:

898

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

ALTER TABLE tablename MODIFY columnname INTEGER;

Cela changera le type de données de la colonne donnée

Selon le nombre de colonnes que vous souhaitez modifier, il peut être préférable de générer un script ou d'utiliser une sorte de GUI client mysql

Yannick Motton
la source
88
Rappel convivial - La valeur par défaut pour les colonnes est NULLABLE, donc si vous avez une colonne NOT NULL, n'oubliez pas d'utiliser "MODIFY nom_colonne INTEGER NOT NULL" sinon vous changerez votre colonne de NOT NULL à NULL.
Despertar
3
La modification de la table supprimera-t-elle les données de la table ou échouera-t-elle si quelque chose ne va pas avec le nouveau type de colonne?
EndermanAPM
1
ALTER TABLE nom de table MODIFY nom de colonne INTEGER unsigned; <- si vous souhaitez que la nouvelle colonne ne soit pas signée. C'était mon cas.
mircealungu
Je pense que l'avertissement @Despertars pourrait également être pertinent pour conserver les spécifications de CHARSET ou COLLATE.
Halvor Holsten Strand
44
alter table table_name modify column_name int(5)
php
la source
37

Vous pouvez également utiliser ceci:

ALTER TABLE [tablename] CHANGE [columnName] [columnName] DECIMAL (10,2)
Richard
la source
12

Si vous souhaitez remplacer toutes les colonnes d'un certain type par un autre type, vous pouvez générer des requêtes à l'aide d'une requête comme celle-ci:

select distinct concat('alter table ',
                       table_name,
                       ' modify ',
                       column_name,
                       ' <new datatype> ',
                       if(is_nullable = 'NO', ' NOT ', ''),
                       ' NULL;')
  from information_schema.columns
  where table_schema = '<your database>' 
    and column_type = '<old datatype>';

Par exemple, si vous souhaitez changer les colonnes de tinyint(4)en bit(1), exécutez-le comme ceci:

select distinct concat('alter table ',
                       table_name,
                       ' modify ',
                       column_name,
                       ' bit(1) ',
                       if(is_nullable = 'NO', ' NOT ', ''),
                       ' NULL;')
  from information_schema.columns
  where table_schema = 'MyDatabase' 
    and column_type = 'tinyint(4)';

et obtenez une sortie comme celle-ci:

alter table table1 modify finished bit(1)  NOT  NULL;
alter table table2 modify canItBeTrue bit(1)  NOT  NULL;
alter table table3 modify canBeNull bit(1)  NULL;

!! Ne conserve pas de contraintes uniques, mais devrait être facilement corrigé avec un autre ifparamètre concat. Je laisserai au lecteur le soin de mettre en œuvre cela si nécessaire ..

Tobb
la source
7
Alter TABLE `tableName` MODIFY COLUMN `ColumnName` datatype(length);

Ex:

Alter TABLE `tbl_users` MODIFY COLUMN `dup` VARCHAR(120);
Mahrukh Mehmood
la source
5

Vous utilisez la alter table ... change ...méthode, par exemple:

mysql> create table yar (id int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into yar values(5);
Query OK, 1 row affected (0.01 sec)

mysql> alter table yar change id id varchar(255);
Query OK, 1 row affected (0.03 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> desc yar;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
1 row in set (0.00 sec)
Ólafur Waage
la source
Je crois que c'est MODIFIER plutôt que changer, mais peut-être que les deux fonctionnent.
Zsolt Szilagyi
4

Pour changer le type de données de colonne, il existe une méthode de changement et une méthode de modification

ALTER TABLE student_info CHANGE roll_no roll_no VARCHAR(255);

ALTER TABLE student_info MODIFY roll_no VARCHAR(255);

Pour changer le nom du champ, utilisez également la méthode change

ALTER TABLE student_info CHANGE roll_no identity_no VARCHAR(255);
Hasib Kamal
la source
1

https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

Vous pouvez également définir une valeur par défaut pour la colonne, ajoutez simplement le mot clé DEFAULT suivi de la valeur.

ALTER TABLE [table_name] MODIFY [column_name] [NEW DATA TYPE] DEFAULT [VALUE];

Cela fonctionne également pour MariaDB (version testée 10.2)

michael01angelo
la source
0

Si vous souhaitez modifier les détails de la colonne ajouter un commentaire, utilisez ceci

ALTER TABLE [table_name] MODIFY [column_name] [new data type] DEFAULT [VALUE] COMMENT '[column comment]' 
Joe_Tz
la source