2013-01-17 143 views
3

我在mysql上创建数据库。首先创建主桌,每桌平均有30列。 和日志表的标准是参照表的PK加每列* 2 像这样:mysql动态创建表格

参考表:

Field | Type  | Null | Key | Default | Extra 
--------+-------------+----------+---------+-------------+---------------- 
TableID | int(11)  | No  | PRI  | Null  | auto_increment 
Col1 | varchar(50) | No  |   | Null  | 

日志表:

Field  | Type  | Null | Key | Default | Extra 
------------+-------------+----------+---------+-------------+---------------- 
LogTableID | int(11)  | No  | PRI  | Null  | auto_increment 
TableID  | int(11)  | No  | MUL  | Null  | 
NewCol1  | varchar(50) | No  |   | Null  | 
UpdatedCol1 | varchar(50) | No  |   | Null  | 

现在我想要的是创建一个过程,我将表名作为参数传递并生成表日志的创建查询并执行它。

这样做的最好方法是什么?

+1

我不清楚这是什么意思:“生成表格日志的创建并执行它。“ - 您是否想要在现有表格中创建新表格或条目?都? – ethrbunny

+1

所以你想要一个存储过程,给定现有表的名称生成另一个基于它的表? – Dutow

回答

5

要让一个字符串表示一个表(或数据库)的名称,您需要将您的查询字符串与变量连接起来,并在存储过程中准备/执行一条语句。这是一个基本的例子。

-- DROP PROCEDURE IF EXISTS createLogTable; 
DELIMITER // 
CREATE PROCEDURE createLogTable(tblName VARCHAR(255)) 
BEGIN 
    SET @tableName = tblName; 
    SET @q = CONCAT(' 
     CREATE TABLE IF NOT EXISTS `' , @tableName, '` (
      `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
      `something` VARCHAR(10) NOT NULL, 
      `somedate` DATETIME NOT NULL, 
      PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 
    '); 
    PREPARE stmt FROM @q; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    -- and you're done. Table is created. 
    -- process it here if you like (INSERT etc) 
END // 

则... CALL createLogTable('exampleTable');

所以其基本思想是

  1. CONCAT必要的程序参数(S)与您的查询
  2. 准备/从这个查询字符串
  3. 执行语句
+0

它可能工作,但我需要获得表中的所有列。我尝试使用MyTable中的显示列,尝试将结果设置为变量。但是我得到了一个错误。 – jcvegan

+0

@JuanCarlosVegaNeira您可以在需要多行的过程中创建临时表,或者可以使用循环。但是,你的主要问题不是很清楚。您可能想要编辑它。 – inhan

+0

@inhan,关于如何在触发器中创建表的任何想法?我已经创建过程,但是当我在触发器中调用此过程时,出现错误。 – Vlad