1

我正在编写一个简单的程序来备份表格-

CREATE PROCEDURE daily_backup()
BEGIN
   DECLARE given_date VARCHAR(25);
   SET given_date = now(); 

   CREATE TABLE given_date LIKE db1.table1;
   INSERT INTO given_date SELECT * FROM db1.table1;


END

但它会创建一个名为 given_date 的表。我想创建一个以日期为名称的表。如何做同样的事情?

4

2 回答 2

2

使用 prepare 生成 create 语句,例如:-

set @given_date = now();
SET @sql = CONCAT("CREATE TABLE ",@given_date," as SELECT * FROM db1.table1");
PREPARE stmt from @sql;
EXECUTE stmt;

ps:- 表名应该根据这个有效。

于 2013-06-14T10:26:33.620 回答
0

试试这个

DELIMITER |
CREATE PROCEDURE daily_backup()
BEGIN
  SET @s = CONCAT('CREATE TABLE bak_', DATE_FORMAT(CURDATE(), '%Y%m%d'), ' SELECT * FROM table1');
  PREPARE stmt FROM @s;
  EXECUTE stmt;
END
|
DELIMITER ;

更新:你可以让它一天运行多次

DROP PROCEDURE daily_backup;
DELIMITER |
CREATE PROCEDURE daily_backup()
BEGIN
  SET @tbl = DATE_FORMAT(CURDATE(), '%Y%m%d');
  SET @s = CONCAT('DROP TABLE IF EXISTS bak_', @tbl);
  PREPARE stmt FROM @s;
  EXECUTE stmt;

  SET @s = CONCAT('CREATE TABLE bak_', @tbl, ' SELECT * FROM table1');
  PREPARE stmt FROM @s;
  EXECUTE stmt;
END
|
DELIMITER ;

这是SQLFiddle演示

于 2013-06-14T10:33:26.530 回答