2008-11-09 125 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()