更改没有主键的表中的每条记录?

时间:2008-11-09 18:01:28

标签: sql mysql primary-key

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

有没有办法让MySQL在SELECT期间为记录分配临时ID,这样我在做UPDATE时会回复它们?

4 个答案:

答案 0 :(得分:5)

这不是吗?

UPDATE
  MyTable
SET
  MyTimeStamp = UNIX_TIMESTAMP(MyDateTime);

答案 1 :(得分:1)

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

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

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

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

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

答案 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;

当然,您应该在删除旧列之前确认转换已正确完成!

请参阅UNIX_TIMESTAMP()STR_TO_DATE()