【问题标题】:How to alter the default value of a column using a procedure如何使用过程更改列的默认值
【发布时间】:2019-04-08 05:10:41
【问题描述】:

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

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

【问题讨论】:

  • 我已经有很多程序了,我认为这不是问题所在。我认为ALTER TABLE 正在引发 SQL 错误,我以前从未更新过 SQL 中的默认值,并且无法弄清楚如何做到这一点@wchiquito
  • 如果我运行 ... BEGIN ALTER TABLE _users MODIFY rid INT(255) NOT NULL DEFAULT '1';... 它可以工作,出于某种原因,我不知道如何将 rid_in 绑定到查询而不是插入“1”。
  • 这里需要用到动态SQL。
  • 不相关:由于PRIMARY KEY 是密钥,因此您不需要key(rid)

标签: mysql sql database mariadb innodb


【解决方案1】:

这里需要使用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 ;

【讨论】:

  • 您好,Madhur!感谢您的快速回答,我收到了一个错误1193 - Unknown system variable 'alter_query_str' :(
  • @Jaquarh 检查更新的答案;在alter_query_str前面添加@
  • 你是明星!在几个小时的时间里,我从你身上学到的东西可能比我生命中的任何人都多,哈哈。我将研究使用动态 SQL、Prepare 语句和CONCAT()。非常感谢这个答案。
  • @Jaquarh 问题的措辞很好 +1。它会自动帮助快速回答:)
猜你喜欢
  • 2012-07-03
  • 2014-11-06
  • 2018-03-08
  • 2010-12-18
  • 2011-06-12
  • 2022-10-08
  • 1970-01-01
  • 2012-03-25
相关资源
最近更新 更多