Изменить каждую запись в таблице без первичного ключа?

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

Есть ли способ заставить MySQL назначать временные идентификаторы записям во время SELECT, чтобы я возвращался к ним при выполнении UPDATE?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
887
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если по какой-то причине вам нужно выполнить итерацию (другие ответы охватывают ситуацию, в которой вы этого не сделаете), я могу придумать два способа сделать это (они не относятся к MySQL):

  1. Добавьте в таблицу столбец с автоматически присвоенным номером. Используйте это в качестве ПК для своих обновлений, а затем отбросьте столбец (или просто сохраните его для использования в будущем).

  2. В таблице без определенного 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);

Примечание для себя: проверьте, может ли MySQL что-то делать, прежде чем предполагать, что это невозможно. Спасибо.

Kyle Cronin 09.11.2008 21:20

Иногда за деревьями не видно леса. Я могу вам еще что-нибудь принести, сэр? :-D

Tomalak 09.11.2008 21:24

P.S .: Остерегайтесь проблем с переходом на летнее время. Если ваши базовые данные позволяют это, сначала преобразуйте дату и время в UTC.

Tomalak 09.11.2008 21:26

Вы можете генерировать значения во время 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;

Конечно, вы должны убедиться, что преобразование было выполнено правильно, прежде чем отбрасывать старый столбец!

См. UNIX_TIMESTAMP() и STR_TO_DATE().

Другие вопросы по теме