如何使用过程更改列的默认值

nzkunb0c  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(262)

下面是我当前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 ;

以下是“我的数据库用户”表的外观:

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)

能够更新每个用户的默认值。

5hcedyr0

5hcedyr01#

您需要在这里使用动态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 ;

相关问题