写入动态命名的MySQL表

时间:2018-02-21 00:15:00

标签: mysql

我正在尝试使用基于模型运行编号的前缀在例程中创建动态命名的MySQL表,我在php中将其设置为@ModelRef变量。

我通常可以创建表没问题,但有时程序在尝试将数据写入新创建的表时崩溃。以下代码有效:

SET @TableName = CONCAT('`',@ModelRef, '_', 'input_actual_php','`');

SET @Table_Text:=CONCAT('CREATE TABLE IF NOT EXISTS ',@TableName, ' (
    case_id                 INT PRIMARY KEY DEFAULT 1,
    Savings1                DECIMAL(10,2) DEFAULT NULL,
    Savings2                DECIMAL(10,2) DEFAULT NULL,
    TermDeposit             DECIMAL(10,2) DEFAULT NULL,
    FC_Dist                 INT DEFAULT NULL)'

    );

    PREPARE stmt from @Table_Text;
    EXECUTE stmt;   

-- Write values to table
    SET @TableEdit:=CONCAT('INSERT INTO ',@TableName,' VALUES
        (case_id, @Savings1, @Savings2, @TermDeposit, @FC_Dist)');

    PREPARE stmt from @TableEdit;
    EXECUTE stmt;   

但是不同例程中的以下代码不会:

SET @TableName_1 = CONCAT('`', @ModelRef, '_lookup_wage_growth','`');

SET @Table_Text_1:=CONCAT('CREATE TABLE IF NOT EXISTS ',@TableName_1, ' (
    Age INT PRIMARY KEY DEFAULT 0,
    ModYear INT DEFAULT 0,
    Growth_1 DECIMAL(5 , 3 ) DEFAULT 0,
    GrowthInd_1 DECIMAL(5 , 3 ) DEFAULT 0,
    NomWage_1 INT DEFAULT 0,
    NomWage_1_UD INT DEFAULT 0)'
);

PREPARE stmt from @Table_Text_1;
EXECUTE stmt; 

-- Code here doing calculations and generating values

-- Write to table
        SET @TableEdit_1:=CONCAT('INSERT INTO ',@TableName_1,' VALUES
            (age_var, ModYear_var, Growth_1_var, GrowthInd_1_var, NomWage_1_var, @NomWage_1_UD)'); 

        PREPARE stmt from @TableEdit_1;
        EXECUTE stmt;

我尝试过并使用了上面的不同变体并简化了所有内容,但我无法解决为什么第二个例程无法写入表并崩溃的原因。有什么我想念的吗?

2 个答案:

答案 0 :(得分:1)

我建议完全反对这种模式。使用一个带有“modelRef”字段的表有什么问题?

但是如果你需要/必须出于某种原因以这种方式继续它;看起来你正在将age_var插入Age,并且age_var没有在任何地方定义,我不确定它是否可以从PREPAREd语句中访问,除非它是一个user / session / @ variable。

假设它在“做计算和产生价值”中被DECLAREd;你需要

SET @TableEdit_1:=CONCAT('INSERT INTO ',@TableName_1,' 
                          VALUES (', age_var, ', ', ModYear_var, ', ' ....

此外,我倾向于小心谨慎,并在存储过程中使用我为该过程生成的guid后缀大多数@ -variable标识符。使用有效的全局变量(用于连接),最终可能难以跟踪错误。

答案 1 :(得分:0)

感谢您提供的所有意见和建议。我已经采取了这些措施并改变了我的做法。

我没有创建和写入动态标记的表,而是将其创建从CREATE TABLE更改为CREATE TEMPORARY TABLE,这消除了用户操作具有通用名称的表之间创建的冲突。只要与数据库的连接存在并且为每个用户创建并且之后立即删除,临时表就会持续很长时间,以便进行例行计算并向客户端提取数据。