Как преобразовать столбец перечисления чисел в tinyint? - PullRequest
0 голосов
/ 11 января 2019

Разработка в Laravel 5.7 с использованием базы данных MySQL. В паре столбцов моей базы данных у меня есть тип enum - я не проводил исследования и сделал перечисление полным цифрами (0-2 или 0-3). Прочитав все за и против, я хочу отойти от перечислений и преобразовать их в миниатюрные.

Как лучше всего изменить тип столбца в моей таблице на tinyint и преобразовать строки '0', '1', '2', '3' в tinyint?

Я действительно не хочу терять свои данные в процессе.

https://laravel.com/docs/5.7/migrations#modifying-columns содержит информацию об изменении столбцов, однако не поддерживает перечисления:

Только следующие типы столбцов могут быть изменены: bigInteger, двоичный, логический, дата, dateTime, dateTimeTz, десятичное, целое, json, longText, mediumText, smallInteger, строка, текст, время, unsignedBigInteger, unsignedInteger и unsignedSmallInteger.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Чтобы быть в безопасности, я бы сделал это, используя временный столбец;

ALTER TABLE tbl ADD COLUMN _temp_col CHAR(1) COLLATE 'latin1_general_ci'; -- CHAR(1) is OK if you only have numeric ENUMs
UPDATE tbl SET _temp_col = col; -- ENUM values would be copied as is
ALTER TABLE tbl MODIFY COLUMN col TINYINT(1) UNSIGNED;
UPDATE tbl SET col = _temp_col; -- Values would be auto-converted to ints
ALTER TABLE tbl DROP COLUMN _temp_col;
0 голосов
/ 11 января 2019

Эксперимент с MySQL-8.0 произвел следующее преобразование.

Кажется, что ALTER TABLE конвертирует 'x' -> x+1. Так что я думаю, что будет изменено в соответствии с последующим UPDATE ниже

select version();
| version() |
| :-------- |
| 8.0.13    |
create table x (y enum ('0','1','2','3') );
insert into x values ('1'),('0'),('2'),('3')
select * from x
| y  |
| :- |
| 1  |
| 0  |
| 2  |
| 3  |
alter table x modify y tinyint unsigned;
select * from x;
|  y |
| -: |
|  2 |
|  1 |
|  3 |
|  4 |
update x set y=y-1
select * from x
|  y |
| -: |
|  1 |
|  0 |
|  2 |
|  3 |

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...