php mysql перенос time() в timestamp

236
29 января 2018, 07:05

здравствуйте, в бд использовал до этого момента time() для установления значения времени (к примеру дата добавление новости), возможно ли теперь конвертировать значение полей с временем, в timestamp формат mysql?

Answer 1

В mysql есть подходящая функция FROM_UNIXTIME. Соответственно необходимо:

  • добавить новое поле с типом timestamp
  • записать в него значения, конвертируя их из имеющегося поля
  • проверить корректность конвертации и удалить старое поле

Т.е. вот так:

mysql> create table migratetest (t int);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into migratetest values (1234567890);
Query OK, 1 row affected (0.04 sec)
mysql> alter table migratetest add column ts timestamp null default null;
Query OK, 1 row affected (0.17 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> select * from migratetest;
+------------+------+
| t          | ts   |
+------------+------+
| 1234567890 | NULL |
+------------+------+
1 row in set (0.00 sec)
mysql> update migratetest set ts = from_unixtime(t) 
       where t is not null and ts is null;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from migratetest;
+------------+---------------------+
| t          | ts                  |
+------------+---------------------+
| 1234567890 | 2009-02-14 02:31:30 |
+------------+---------------------+
1 row in set (0.00 sec)
mysql> alter table migratetest drop column t;
Query OK, 1 row affected (0.18 sec)
Records: 1  Duplicates: 0  Warnings: 0

Новое поле затем возможно переименовать в старое, но из-за смены формата у вас и приложение скорей всего изменялось и удобнее как раз оставить использовать с новым именем.

Если время миграции получается довольно большим и необходимо сохранить работоспособность приложения - то процедура несколько изменяется:

  • после добавления нового поля код приложение обновляется таким образом, чтобы читать данные только из старого поля, а писать (и обновлять) - оба, и старое и новое одновременно. Либо для этого можно создать пару триггеров: на before insert и before update
  • после этого update модифицируется чтобы обновлять данные небольшими порциями, например по дополнительному условию id >= 1000 and id < 2000
  • когда все строки обновлены, то приложение обновляется ещё раз с тем чтобы использовать только новое поле
  • затем старое поле можно удалять

А вот как в mysql добавлять и удалять поля без длительной блокировки таблицы - уже достойно отдельного вопроса

READ ALSO
Checkbox и sql?

Checkbox и sql?

Здравствуйте, не могу понять, при выставлении галочки, запись в бд не идетВот кусочек кода, если нужен полный, скину

205
получение данных по tcp PHP_BINARY_READ

получение данных по tcp PHP_BINARY_READ

Есть тестовый tcp-сервер

239
Стили для шаблона gantry

Стили для шаблона gantry

Скажите, пожалуйста, где можно поменять стили для шаблона gantryКеш я очистила, в настройке шаблона и настройках сайта(не кешировать файлы)

227
Как правильно составить запрос к Mysql? [дубликат]

Как правильно составить запрос к Mysql? [дубликат]

На данный вопрос уже ответили:

217