0

我在数据库中有一个以文本形式表示日期的表(即“2008-11-09”),我想用 UNIX 时间戳替换它们。但是,我不认为 MySQL 能够自己进行转换,所以我想编写一个小脚本来进行转换。我能想到的方法包括获取表中的所有记录,遍历它们,并更新数据库记录。但是,由于没有主键,我无法轻松获得需要更新的确切记录。

有没有办法让 MySQL 在 SELECT 期间为记录分配临时 ID,以便我在执行 UPDATE 时参考它们?

4

4 回答 4

5

这不做吗?

UPDATE
  MyTable
SET
  MyTimeStamp = UNIX_TIMESTAMP(MyDateTime);
于 2008-11-09T18:10:52.330 回答
1

如果由于某种原因您必须进行迭代(其他答案涵盖了您不需要迭代的情况),我可以想到两种方法(这些不是 MySQL 特定的):

  1. 在表中添加一个自动分配编号的列。将其用作更新的 PK,然后删除该列(或将其保留以备将来使用)。

  2. 在没有定义 PK 的表中,只要不存在完全重复的行,就可以将整行作为复合 PK;只需将行中的每一列用作您的显着特征。即,如果表有 3 列,“名称”、“地址”和“更新”,请执行以下操作:

    UPDATE mytable SET updated = [timestamp value] WHERE name = [name] AND address = [address] AND timestamp = [old timestamp]

许多数据访问框架使用这种精确的策略来实现乐观并发。

于 2008-11-09T18:10:07.823 回答
1

不,您应该能够使用单个更新语句来执行此操作。如果所有日期都是 yyyy-mm-dd 并且它们只是存储在某种文本列而不是 DATETIME 中,则您可以将数据移过来。SQL 就像:

ALTER TABLE t ADD COLUMN dates DATETIME;
UPDATE t set t.dates=t.olddate;

这不应该依赖于 PK,因为 MySQL 可以扫描表中的每一行。PK 成为问题的唯一一次是如果您需要更新单行,但该行可能不是唯一的。

于 2008-11-09T18:10:27.963 回答
1

您可以在使用 MySQL 用户变量功能期间生成值SELECT,但这些值不引用行;它们只是结果集的临时部分。您不能在UPDATE语句中使用它们。

SET @v := 0;
SELECT @v:=@v+1, * FROM mytable;

这是我解决问题的方法。无论如何,您将不得不为您的 UNIX 时间戳创建另一列,因此您可以先添加它。然后将旧 datetime 列中的值转换为 UNIX 时间戳并将其放入新列中。然后删除旧的文本日期时间列。

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()

于 2008-11-09T18:14:43.867 回答