2015-03-30 189 views
0

如果你像這樣運行MySQL中的SQL語句:是否可以更改MySQL表的create_time?

SHOW TABLE STATUS LIKE 'TableName' 

您將獲得包含日期/時間創建的表中的列CREATE_TIME。

有沒有辦法通過SQL查詢修改或「觸摸」該日期/時間?

此表存儲非關係緩存數據,有時我想重用即使數據較舊的數據。

+2

如何創建表的日期從使用數據阻止你?還有一個Update_time字段,但不適用於所有引擎。 – Dijkgraaf 2015-03-30 23:36:50

+0

如果你像這樣在MySQL中運行SQL語句:'SELECT your_very_old_data FROM your_really_old_table WHERE your_condition'你將獲得數據。注意創建日期在檢索數據時沒有發言權。 – 2015-03-31 14:18:45

+0

緩存邏輯不在SQL中,它在外部代碼中。每次我想使用舊數據時,我都不想改變這個邏輯。 – humbads 2015-03-31 15:02:18

回答

0

如果您可以更改表的創建時間,那麼這會有些違反直覺嗎?就像@Dijkgraaf建議的那樣,您可能想重新考慮您的要求 - 這個問題聽起來很像XY problem。您不應該需要來首先更新表的創建時間。只需將所需的時間戳存儲在緩存數據旁邊的列中,那又如何呢?

也就是說,如果您確實需要更新的創建時間,那麼您可以簡單地創建一個新表和copy the data over(當然,這是時間和空間上的O(n))。

+0

Unix有一個'touch'命令來更新文件的創建時間。沒有什麼反直覺的,因爲這是一個常見的用例,告訴系統對象是新的,但沒有改變。如果它具有此功能,它將使MySQL更有用。 – humbads 2017-04-06 17:23:52

+0

公平點,但我認爲合併文件和數據庫表是不合理的。它們在許多基礎方面有所不同。 – dimo414 2017-04-06 17:28:15

0

雖然可以使用USE語句選擇INFORMATION_SCHEMA作爲默認數據庫,但只能讀取表的內容,不能對它們執行INSERT,UPDATE或DELETE操作。

Usage Notes for the INFORMATION_SCHEMA Database

它看起來是不可能改變表的元數據。 我希望避免在用戶表中存儲'創建時間'以節省開發時間。

如果表格數據超過24小時,我的緩存邏輯會刷新表格數據。刷新可能需要幾個小時,而且我不希望每次重新使用舊數據時都必須更改緩存邏輯。 Linux有一個'touch'命令來更新文件時間戳,所以我想知道MySQL是否有類似的東西。

下面是我的SQL腳本來重新創建表,它不更新CREATE_TIME,但速度很慢:

-- MySQL SQL Script to recreate a table 
-- for the purpose of updating the create_time 

-- Create copy of the table with its indexes 
CREATE TABLE tempForTouch LIKE TableToTouch; 

-- Disable the indexes 
ALTER TABLE tempForTouch DISABLE KEYS; 

-- For performance, lock the tables 
LOCK TABLES TableToTouch WRITE, tempForTouch WRITE; 

-- Copy the data to the new table 
INSERT INTO tempForTouch SELECT * FROM TableToTouch; 

-- Unlock the tables 
UNLOCK TABLES; 

-- Re-enable the indexes 
ALTER TABLE tempForTouch ENABLE KEYS; 

-- Drop the original table 
DROP TABLE TableToTouch; 

-- Rename the temporary table to the new table 
RENAME TABLE tempForTouch TO TableToTouch;