我在数据库中有一个以文本方式表示日期的表(即“2008-11-09”),我想用UNIX时间戳替换它们。但是,我不认为MySQL能够自己进行转换,所以我想编写一个小脚本来进行转换。我能想到的方法包括获取表中的所有记录,迭代它们,以及更新数据库记录。但是,如果没有主键,我就无法轻易获得需要更新的确切记录。
有没有办法让MySQL在SELECT期间为记录分配临时ID,这样我在做UPDATE时会回复它们?
答案 0 :(得分:5)
这不是吗?
UPDATE
MyTable
SET
MyTimeStamp = UNIX_TIMESTAMP(MyDateTime);
答案 1 :(得分:1)
如果由于某种原因你必须迭代(其他答案涵盖了你不这样做的情况),我可以想到两种方法(这些不是特定于MySQL的):
在表中添加一个自动分配的数字列。使用它作为更新的PK,然后删除列(或者保留它以备将来使用)。
在没有定义PK的表中,只要没有完全重复的行,就可以将整行用作复合PK;只需使用行中的每一列作为区别特征。即,如果表格有3列,“名称”,“地址”和“更新”,请执行以下操作:
UPDATE mytable SET updated = [timestamp value] WHERE name = [name] AND address = [address] AND timestamp = [old timestamp]
许多数据访问框架使用这种确切的策略来实现乐观并发。
答案 2 :(得分:1)
不,您应该可以使用单个更新语句执行此操作。如果所有日期都是yyyy-mm-dd并且它们只是存储在某种文本列而不是DATETIME中,那么您只需移动数据即可。 SQL就像:
ALTER TABLE t ADD COLUMN dates DATETIME;
UPDATE t set t.dates=t.olddate;
这不应该依赖于PK,因为MySQL可以扫描表中的每一行。 PK成为问题的唯一时间是您需要更新单行,但该行可能不是唯一的。
答案 3 :(得分:1)
您可以使用MySQL用户变量功能在SELECT
期间生成值,但这些值不会引用该行;它们只是结果集的临时部分。您无法在UPDATE
语句中使用它们。
SET @v := 0;
SELECT @v:=@v+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;
当然,您应该在删除旧列之前确认转换已正确完成!