我有一个更新表的过程。但是,我需要在每次更新之前备份该表。因此,我可以通过过程备份表的唯一方法是创建一个表并将所有信息从一个表插入到另一个表中。
所以我需要做的是创建一个带有随机值的表名来区分不同的表。理想的解决方案是“New_Table_Name_TIMESTAMP”,因此将时间戳附加到字符串。
我的问题是如何创建一个时间戳添加到其名称的表 New_table_name_201412301044
我试过以下
DECLARE new_table varchar(100) DEFAULT '';
SET new_table = CONCAT('WORKFLOW_BU_', client_id_to_update, '_', unix_timestamp() );
CREATE TABLE data_import.new_table LIKE development.inventory_engine;
INSERT INTO data_import.new_table
SELECT * FROM development.inventory_engine;
但它创建了一个名为“new_table”的表名,而不是变量
由于
答案 0 :(得分:1)
您将不得不使用所谓的动态SQL,也称为“服务器端预处理语句”来执行此操作。普通SQL禁止对表或列的名称使用变量。
见这里。
http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html
答案 1 :(得分:0)
听起来不错,但您可以使用PREPARE statement FROM @sql
和EXECUTE statement
这样做sqlFiddle
样本表
CREATE table yourTable(id int auto_increment primary key,value varchar(50));
INSERT into yourtable(value) values ('test1'),('test2'),('test3'),('test4');
创建一个带有time_stamp结尾的表格(在示例中,我只记录到HOUR,如果您希望将其缩小到秒数,可以将_%i_%s
添加到格式。
SET @TimeStamp = DATE_FORMAT(NOW(),'%Y_%m_%d_%H');
SET @sql = CONCAT('CREATE table yourTable',@TimeStamp,'(id int auto_increment primary key,value varchar(50))');
PREPARE statement FROM @sql;
EXECUTE statement;
SET @sql = CONCAT('INSERT INTO yourTable',@TimeStamp,'(id,value) SELECT id,value FROM yourTable');
PREPARE statement FROM @sql;
EXECUTE statement;