2008-11-09 32 views
0

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

有没有办法让MySQL在SELECT中分配临时ID给记录,以便在执行UPDATE时引用它们?

回答

5

这不行吗?

UPDATE 
    MyTable 
SET 
    MyTimeStamp = UNIX_TIMESTAMP(MyDateTime); 
+0

自我提醒:检查是否MySQL能假设它之前不能做一些事情。谢谢。 – 2008-11-09 18:20:22

1

如果由于某种原因你必须遍历(其他答案涵盖你不这样做的情况下),我能想到的两种方法可以做到这一点(这些都不是MySQL特有):

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

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

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

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

1

不,你应该可以用一个更新语句来做到这一点。如果所有日期都是yyyy-mm-dd,并且它们只是存储在某种文本列而不是DATETIME中,则可以将数据移过来。 SQL会是这样的:

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

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

1

可以使用MySQL的用户变量设有SELECT过程中产生的值,但这些值不涉及该行;它们只是结果集的临时部分。您不能在UPDATE声明中使用它们。

SET @v := 0; 
SELECT @v:[email protected]+1, * FROM mytable; 

下面是我如何解决问题。无论如何,您将不得不为UNIX时间戳创建另一列,因此您可以先添加它。然后将旧的日期时间列中的值转换为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()