我的SQL在ALTER TABLE ADD COLUMN语句中使用变量
问题描述:
您好我正在创建一个日期为列名称的表。我的SQL在ALTER TABLE ADD COLUMN语句中使用变量
我使用此代码列添加到表:
DROP PROCEDURE IF EXISTS filldates;
DELIMITER |
CREATE PROCEDURE filldates(dateStart DATE, dateEnd DATE)
BEGIN
WHILE dateStart <= dateEnd DO
ALTER TABLE dates
ADD dateStart VARCHAR(30);
SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
END WHILE;
END;
|
DELIMITER ;
CALL filldates('2017-01-01','2017-12-31');
但它显示错误dateStart重复的内容,因为它创造了一个列,而不是日期“dateStart”。 如何使用dateStart作为变量。当我使用“INSERT INTO tablename(_date)VALUES(dateStart);”时,而不是ALTER TABLE语句,它不显示任何错误,它将日期插入到数据库中,而是作为'_date'列中的行插入。我希望将日期添加为列名称。
如何使用dateStart作为变量
答
简短的回答是,你不能使用变量作为数据库,表,或在MySQL的列名。
您可以做的唯一事情是将sql语句连接为字符串并将其作为prepared statement执行。
SET @s=CONCAT('ALTER TABLE dates ADD COLUMN `',dateStart,'` VARCHAR(30)');
PREPARE stmt1 FROM @s1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
然而,在大量动态添加字段名的表通常表示一个不好的设计(除非你正在准备物化透视表报告的目的出的数据是不能更改)。
答
这将成为你的表的添加列,但这不是一个好主意。
set @datestart = "2017-01-03";
set @sql = concat('Alter table tbl_1 Add Column `' ,@datestart, '`Varchar(30)');
PREPARE stmt from @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
如果你想要一个循环,然后使用Cursor
这将是你的表的设计不好。 –