Мой 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 вместо date. Как я могу использовать dateStart как переменную.
Когда я использую "INSERT INTO tablename (_date) VALUES (dateStart);" вместо инструкции ALTER TABLE он не показывает никакой ошибки и вставляет даты в базу данных, но в виде строк в столбце "_date". Я хочу, чтобы даты были добавлены в качестве названия столбца.
Как можно использовать dateStart в качестве переменной
3 ответа
Краткий ответ: вы не можете использовать переменные в качестве имен баз данных, таблиц или столбцов в MySQL.
Единственное, что вы можете сделать, - это объединить оператор sql как строку и выполнить его как подготовленный оператор.
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;
Если вы хотели цикл, используйте курсор
У меня такая же проблема, и это сработало для меня.
объявить @colname varchar (128)set @colname= convert (varchar,DATEPART (DAY, GetDate ())) + '' + convert (varchar,DATEPART (MONTH, GetDate ())) + convert (varchar,DATEPART (YYYY, GetDate ())) exec ('ALTER TABLE temp ADD [' + @colname +'] int NULL')