如何使用 SQL 过程同时添加新属性和更新值?

Posted

技术标签:

【中文标题】如何使用 SQL 过程同时添加新属性和更新值?【英文标题】:How to use SQL procedure to add new attribute and update the value at the same time? 【发布时间】:2020-05-16 12:23:53 【问题描述】:

我正在尝试创建一个过程,该过程 (1) 将名为 'Hours' 的新属性添加到名为 'Project' 的表中(如果它没有 'Hour' 属性)和 (2) 初始化 'Hour' 的值' 到 0.0。下面是我尝试过的代码(使用 myphpAdmin),但它给了我 SQL 语法错误。我做错了什么?

错误消息显示“您的 SQL 语法有错误;请查看与您的 mysql 服务器版本相对应的手册,以在 'UPDATE Project SET Hours = 0.0 where Project.Pnumber = p end if; end' 附近使用正确的语法”

delimiter &
create procedure init(in p int(11))
begin
    declare attNum int;
    SELECT COUNT(*) INTO attNum FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_schema = 'MyDB'
        AND table_name = 'Project';
    if attNum < 5 then ALTER TABLE Project ADD Hours float; 
    end if;

     SELECT * FROM Project 
     where Project.Pnumber = p 
     UPDATE Project SET Hours = 0.0
     where Project.Pnumber = p
end

【问题讨论】:

【参考方案1】:

(1) 将名为 'Hours' 的新属性添加到名为 'Project' 的表中(如果它没有 'Hour' 属性)并且 (2) 将 'Hour' 的值初始化为 0.0。

您为什么要为此使用存储过程?在任何情况下,您都可以使用 alter tabledefault 值来做到这一点:

alter table project add hours float default 0.0

Here 是一个 dbfiddle。

我不建议将此类逻辑包装在存储过程中。据推测,它只进行一次。如果您确实需要在存储过程中执行此操作,只需运行上述命令。如果该列已经存在,MySQL 会返回一个错误——您可以在存储过程中处理该错误。

【讨论】:

非常感谢戈登的回答!我知道我正在尝试做的事情很奇怪。但我真的想使用程序将“小时”属性初始化为 0.0,仅用于我选择的特定元组。例如,如果我调用“call init(5)”,我只想初始化p = 5的元组。还有其他方法可以实现吗?? @jasone 。 . .这不是你在这里问的问题。【参考方案2】:

存储过程创建查询中选择和更新查询末尾缺少分号。

更正查询:

delimiter &
create procedure init(in p int(11))
begin
    declare attNum int;
    SELECT COUNT(*) INTO attNum FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_schema = 'MyDB'
        AND table_name = 'Project';
    if attNum < 5 then ALTER TABLE Project ADD Hours float; 
    end if;

     SELECT * FROM Project 
     where Project.Pnumber = p;
     UPDATE Project SET Hours = 0.0
     where Project.Pnumber = p;
end

【讨论】:

非常感谢 Nishant!由于缺少一个冒号,我花了最后 1 个小时苦苦挣扎!

以上是关于如何使用 SQL 过程同时添加新属性和更新值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 查询将值传递给具有空间/地理数据类型的存储过程

如何在使用Devise注册时创建新用户时添加或更新关联的属性?

更新:如何修复过程语句中的 SQL 错误:新错误 [重复]

如何按特定顺序从 select 中执行 Oracle SQL 更新?

如何更新oracle表中的分区字段

如何使用新值对象进行jsonify?