如何使用 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 table
和 default
值来做到这一点:
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注册时创建新用户时添加或更新关联的属性?