如果你像这样运行MySQL中的SQL语句:是否可以更改MySQL表的create_time?
SHOW TABLE STATUS LIKE 'TableName'
您将获得包含日期/时间创建的表中的列CREATE_TIME。
有没有办法通过SQL查询修改或“触摸”该日期/时间?
此表存储非关系缓存数据,有时我想重用即使数据较旧的数据。
如果你像这样运行MySQL中的SQL语句:是否可以更改MySQL表的create_time?
SHOW TABLE STATUS LIKE 'TableName'
您将获得包含日期/时间创建的表中的列CREATE_TIME。
有没有办法通过SQL查询修改或“触摸”该日期/时间?
此表存储非关系缓存数据,有时我想重用即使数据较旧的数据。
如果您可以更改表的创建时间,那么这会有些违反直觉吗?就像@Dijkgraaf建议的那样,您可能想重新考虑您的要求 - 这个问题听起来很像XY problem。您不应该需要来首先更新表的创建时间。只需将所需的时间戳存储在缓存数据旁边的列中,那又如何呢?
也就是说,如果您确实需要更新的创建时间,那么您可以简单地创建一个新表和copy the data over(当然,这是时间和空间上的O(n))。
虽然可以使用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;
如何创建表的日期从使用数据阻止你?还有一个Update_time字段,但不适用于所有引擎。 – Dijkgraaf 2015-03-30 23:36:50
如果你像这样在MySQL中运行SQL语句:'SELECT your_very_old_data FROM your_really_old_table WHERE your_condition'你将获得数据。注意创建日期在检索数据时没有发言权。 – 2015-03-31 14:18:45
缓存逻辑不在SQL中,它在外部代码中。每次我想使用旧数据时,我都不想改变这个逻辑。 – humbads 2015-03-31 15:02:18