У меня есть таблица в базе данных, которая представляет даты в текстовом виде (например, «2008-11-09»), и я хотел бы заменить их меткой времени UNIX. Однако я не думаю, что MySQL способен выполнять преобразование самостоятельно, поэтому я хотел бы написать небольшой скрипт для выполнения преобразования. То, как я могу это сделать, включает получение всех записей в таблице, их итерацию и обновление записей базы данных. Однако без первичного ключа я не могу легко получить точную запись, которую мне нужно обновить.
Есть ли способ заставить MySQL назначать временные идентификаторы записям во время SELECT, чтобы я возвращался к ним при выполнении UPDATE?


Если по какой-то причине вам нужно выполнить итерацию (другие ответы охватывают ситуацию, в которой вы этого не сделаете), я могу придумать два способа сделать это (они не относятся к MySQL):
Добавьте в таблицу столбец с автоматически присвоенным номером. Используйте это в качестве ПК для своих обновлений, а затем отбросьте столбец (или просто сохраните его для использования в будущем).
В таблице без определенного PK, если нет точных повторяющихся строк, вы можете использовать всю строку как составной PK; просто используйте каждый столбец в строке как отличительную характеристику. то есть, если в таблице 3 столбца: «имя», «адрес» и «обновлено», выполните следующие действия:
ОБНОВЛЕНИЕ mytable SET обновлен = [значение метки времени] ГДЕ имя = [имя] И адрес = [адрес] И метка времени = [старая метка времени]
Многие платформы доступа к данным используют именно эту стратегию для реализации оптимистичного параллелизма.
Нет, вы сможете сделать это с помощью одного оператора обновления. Если все даты в формате гггг-мм-дд, и они просто хранятся в каком-то текстовом столбце вместо DATETIME, вы можете просто переместить данные. SQL будет выглядеть так:
ALTER TABLE t ADD COLUMN dates DATETIME;
UPDATE t set t.dates=t.olddate;
Это не должно зависеть от ПК, потому что MySQL может сканировать каждую строку в таблице. Единственный раз, когда PK становится проблемой, - это если вам нужно обновить одну строку, но строка может быть не уникальной.
Это не так?
UPDATE
MyTable
SET
MyTimeStamp = UNIX_TIMESTAMP(MyDateTime);
Иногда за деревьями не видно леса. Я могу вам еще что-нибудь принести, сэр? :-D
P.S .: Остерегайтесь проблем с переходом на летнее время. Если ваши базовые данные позволяют это, сначала преобразуйте дату и время в UTC.
Вы можете генерировать значения во время SELECT, используя функцию пользовательских переменных MySQL, но эти значения не относятся к строке; они только временные части набора результатов. Вы не можете использовать их в операторах UPDATE.
SET @v := 0;
SELECT @v:=@v+1, * FROM mytable;
Вот как бы я решил проблему. В любом случае вам придется создать еще один столбец для временных меток UNIX, поэтому вы можете сначала добавить его. Затем преобразуйте значения в старом столбце datetime в метку времени UNIX и поместите ее в новый столбец. Затем отбросьте старый текстовый столбец datetime.
ALTER TABLE mytable ADD COLUMN unix_timestamp INT UNSIGNED NOT NULL DEFAULT 0;
UPDATE mytable
SET unix_timestamp = UNIX_TIMESTAMP( STR_TO_DATE( text_timestamp, '%Y-%m-%d' ) );
ALTER TABLE mytable DROP COLUMN text_timestamp;
Конечно, вы должны убедиться, что преобразование было выполнено правильно, прежде чем отбрасывать старый столбец!
Примечание для себя: проверьте, может ли MySQL что-то делать, прежде чем предполагать, что это невозможно. Спасибо.