2015-03-30 110 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; 
相关问题