Wie ändere ich den Datentyp für eine Spalte in MySQL?

488

Ich möchte den Datentyp mehrerer Spalten von float in int ändern. Was ist der einfachste Weg, dies zu tun?

Es gibt noch keine Daten, über die Sie sich Sorgen machen müssen.

Eric Wilson
quelle
6
Um dies explizit zu machen ALTER TABLE, funktionieren die folgenden Antworten (mit ) tatsächlich auch dann, wenn die Spalte bereits Daten enthält. Wenn Sie jedoch eine Float-Spalte in eine Ganzzahl-Spalte konvertieren, werden alle darin enthaltenen Nicht-Ganzzahl-Werte auf die nächste Ganzzahl gerundet.
Ilmari Karonen

Antworten:

897

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

ALTER TABLE tablename MODIFY columnname INTEGER;

Dadurch wird der Datentyp der angegebenen Spalte geändert

Abhängig davon, wie viele Spalten Sie ändern möchten, ist es möglicherweise am besten, ein Skript zu generieren oder eine Art MySQL-Client-GUI zu verwenden

Yannick Motton
quelle
88
Freundliche Erinnerung - Die Standardeinstellung für Spalten ist NULLABLE. Wenn Sie also eine NOT NULL-Spalte haben, vergessen Sie nicht, "MODIFY columnname INTEGER NOT NULL" zu verwenden. Andernfalls ändern Sie Ihre Spalte von NOT NULL in NULL.
Despertar
3
Löscht alter table die Daten in der Tabelle oder schlägt die Ausführung fehl, wenn beim neuen Spaltentyp keine Beanstandung vorliegt?
EndermanAPM
1
ALTER TABLE Tabellenname MODIFY Spaltenname INTEGER ohne Vorzeichen; <- Wenn Sie sich dafür interessieren, dass die neue Spalte nicht signiert ist. War mein Fall.
mircealungu
Ich denke, die @ Despertars-Warnung könnte auch relevant sein, um die Spezifikationen von CHARSET oder COLLATE beizubehalten.
Halvor Holsten Strand
44
alter table table_name modify column_name int(5)
php
quelle
37

Sie können dies auch verwenden:

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

Wenn Sie alle Spalten eines bestimmten Typs in einen anderen Typ ändern möchten, können Sie Abfragen mit einer Abfrage wie der folgenden generieren:

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

Wenn Sie beispielsweise Spalten von tinyint(4)in ändern möchten bit(1), führen Sie es folgendermaßen aus:

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)';

und erhalten Sie eine Ausgabe wie folgt:

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;

!! Behält keine eindeutigen Einschränkungen bei, sollte aber leicht mit einem anderen ifParameter zu behoben werden können concat. Ich überlasse es dem Leser, dies bei Bedarf umzusetzen.

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

Ex :

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

Sie verwenden die alter table ... change ...Methode zum Beispiel:

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
quelle
Ich glaube, es ist eher ÄNDERN als ändern, aber vielleicht funktioniert beides.
Zsolt Szilagyi
4

Um Spaltendatentyp Änderung gibt es Änderungsverfahren und modify - Methode

ALTER TABLE student_info CHANGE roll_no roll_no VARCHAR(255);

ALTER TABLE student_info MODIFY roll_no VARCHAR(255);

Um die Feldnamen zu ändern verwenden auch die Änderungsverfahren

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

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

Sie können auch einen Standardwert für die Spalte festlegen, indem Sie einfach das Schlüsselwort DEFAULT gefolgt vom Wert hinzufügen.

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

Dies funktioniert auch für MariaDB (getestete Version 10.2)

michael01angelo
quelle
0

Wenn Sie die Spaltendetails ändern möchten, fügen Sie einen Kommentar hinzu

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