我的 sql 在 ALTER TABLE ADD COLUMN 语句中使用了一个变量

Abd*_*lla 6 mysql database alter-table mysql-variables

嗨,我想创建一个以日期作为列名的表。

我正在使用此代码将列添加到表中:

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');
Run Code Online (Sandbox Code Playgroud)

但它将错误 dateStart 显示为重复内容,因为它创建了一个列“dateStart”而不是日期。如何使用 dateStart 作为变量。

当我使用“INSERT INTO tablename (_date) VALUES (dateStart);”时 而不是 ALTER TABLE 语句,它不显示任何错误,它正在将日期插入数据库,但作为“_date”列中的行。我希望将日期添加为列名。

如何使用 dateStart 作为变量

Sha*_*dow 10

简短的回答是您不能将变量用作 MySQL 中的数据库、表或列名。

您唯一能做的就是将 sql 语句连接为字符串并作为准备好的语句执行。

SET @s=CONCAT('ALTER TABLE dates ADD COLUMN `',dateStart,'` VARCHAR(30)');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
Run Code Online (Sandbox Code Playgroud)

但是,向表中大量动态添加字段名称通常表明设计不佳(除非您正在准备物化数据透视表以使用无法更改的数据进行报告)。