Как изменить значение столбца по умолчанию с помощью процедуры - PullRequest
0 голосов
/ 04 ноября 2018

Вот как выглядит мой текущий SQL:

DELIMITER $$
CREATE PROCEDURE updateDefaultUserRole(
    IN rid_in INT
) BEGIN
    ALTER TABLE _users
    MODIFY rid INT(255) NOT NULL DEFAULT rid_in; -- Modify the columns default value
    UPDATE _users SET rid = rid_in WHERE rid < rid_in; -- Update all entries lower than the role ID.
END $$
DELIMITER ;

Вот как выглядит моя таблица _users базы данных:

CREATE TABLE `_users` (
  `uid` int(255) NOT NULL,
  `forname` varchar(40) NOT NULL,
  `surname` varchar(40) NOT NULL,
  `email` varchar(120) NOT NULL,
  `hash` varchar(60) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `rid` int(255) NOT NULL DEFAULT '2'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `_users`
  ADD PRIMARY KEY (`uid`),
  ADD KEY `rid` (`rid`);
  MODIFY `uid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

Я получаю эту ошибку:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с 'rid_in; - Изменить значение столбца по умолчанию

Какая ссылка на эту строку:

ALTER TABLE _users
MODIFY rid INT(255) NOT NULL DEFAULT rid_in;

Если я изменю это, игнорируя значение rid_in:

ALTER TABLE _users
MODIFY rid INT(255) NOT NULL DEFAULT '1';

Работает нормально, как я могу связать ввод rid_in с запросом?

Мой ожидаемый вывод - возможность использовать значение роли пользователя по умолчанию и обновить все строки со старым значением пользователя на новое:

CALL updateDefaultUserRole(@someInt)

Для возможности обновления значения по умолчанию для каждого пользователя.

1 Ответ

0 голосов
/ 04 ноября 2018

Вам необходимо использовать Динамический SQL здесь, поскольку предложение Default в Alter Table не сможет разрешить значение переменной:

DELIMITER $$
CREATE PROCEDURE updateDefaultUserRole(
    IN rid_in INT
) BEGIN

    -- generate the query string for Alter Table
    SET @alter_query_str = CONCAT('ALTER TABLE _users
                                   MODIFY rid INT(255) NOT NULL 
                                   DEFAULT ', 
                                  rid_in); -- Modify the columns default value
    -- prepare the query
    PREPARE stmt FROM @alter_query_str;
    -- execute the query
    EXECUTE stmt;
    -- deallocate the query
    DEALLOCATE PREPARE stmt;

    UPDATE _users SET rid = rid_in 
    WHERE rid < rid_in; -- Update all entries lower than the role ID.

END $$
DELIMITER ;
...