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

标签 mysql sql database mariadb innodb

这是我当前的 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;

我收到这个错误:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'rid_in; -- Modify the columns default value

哪些链接到这一行:

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 输入绑定(bind)到查询?

我的预期输出是能够用于更改默认用户角色值并将具有旧用户值的所有行更新为新用户值:

CALL updateDefaultUserRole(@someInt)

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

最佳答案

您需要使用 Dynamic SQL在这里,因为 Alter Table 中的 Default 子句将无法解析变量值:

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 ;

关于mysql - 如何使用过程更改列的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53144281/

相关文章:

database - Delphi XE8 中没有 TTable 组件

mysql - 添加整数列和日期时间列的值并与当前日期进行比较

php - 优化昂贵的 php 查询/子查询

c# - SQLConnection.Open() 与 .sdf 数据库;抛出异常

java - 在 Mac OSX 10.6.8 上找不到 mysqladmin

mysql - 如何恢复始终作为列生成的mysql备份?

php - 使用if语句向数据库中插入数据

php - 数组到 JSON 编码带有希伯来字符的奇怪行为

java - Hibernate一对多关系: can't remove children once parent is removed

mysql - 查询获取一列的最高 ROW_NUM() 值 AS 仅 RANK() 另一列的值