我正在尝试使用基于模型运行编号的前缀在例程中创建动态命名的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;
我尝试过并使用了上面的不同变体并简化了所有内容,但我无法解决为什么第二个例程无法写入表并崩溃的原因。有什么我想念的吗?
答案 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
,这消除了用户操作具有通用名称的表之间创建的冲突。只要与数据库的连接存在并且为每个用户创建并且之后立即删除,临时表就会持续很长时间,以便进行例行计算并向客户端提取数据。