首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL:更新所有同名变量

MySQL:更新所有同名变量
EN

Stack Overflow用户
提问于 2017-11-28 12:25:10
回答 2查看 247关注 0票数 0

我想问一下,用一个mysql,怎样才能将asc_category中的"orange“名称更新为"oranges”,并将所有变量"fruit“更新为"fruits”?

此mysql只会更改特定asc_id行中的变量名称。

代码语言:javascript
运行
复制
$sql = "UPDATE food SET asc_maincategory = '$asc_maincategory', asc_subcategory = '$asc_subcategory' WHERE asc_id = '$asc_id' ";

谢谢..

EN

回答 2

Stack Overflow用户

发布于 2017-11-28 12:29:17

我们可以这样做:

代码语言:javascript
运行
复制
UPDATE food
   SET asc_subcategory = 'oranges'
 WHERE asc_subcategory = 'orange'
;

还有这个:

代码语言:javascript
运行
复制
UPDATE food 
   SET asc_maincategory = 'fruits'
 WHERE asc_maincategory = 'fruit'
;

编辑

问:“可以使用一个mysql同时运行两个进程吗?”

答:是的,我们可以在一条SQL语句中执行这两个操作。SQL语法稍微复杂一点。

问:“因为我想要的是,当用户编辑橙子和水果的名称时,mysql会同时更新该asc_id的名称”橙子“,同时将asc_maincategory中所有的”水果“名称更新为”水果“。

答:如果我理解操作的规范,它听起来像是实现一个危险的操作。但这是可以做到的。

首先编写一条SELECT语句:

代码语言:javascript
运行
复制
SELECT t.asc_id
     , t.asc_maincategory
     , t.asc_subcategory
     , 'fruits'                                          AS new_maincategory 
     , IF(t.asc_id=s.asc_id,'oranges',t.asc_subcategory) AS new_subcategory
  FROM ( SELECT f.asc_id
              , f.asc_maincategory
           FROM food f
          WHERE f.asc_id = '10001'
       ) s
  JOIN food t
    ON t.asc_maincategory = s.asc_maincategory
 ORDER BY t.asc_id

连接到食品表,以检索具有匹配asc_maincategory的所有行。

具有new_等别名的表达式将返回我们想要分配给列的新值。此表达式:

代码语言:javascript
运行
复制
IF(t.asc_id=s.asc_id,'oranges',t.asc_subcategory)

对于其他行,它返回asc_subcategory列的当前值。

如果我们将一列的当前值分配回相同的列(在同一行上),则不会产生任何更改。例如,如果bar是表foo中的一列,则可以运行以下语句

代码语言:javascript
运行
复制
UPDATE foo t
   SET t.bar = t.bar

将列的当前值分配回自身,从而不会对列进行任何更改(除非存在任何BEFORE/AFTER UPDATE触发器。)

一旦SELECT语句生效,我们就可以将其转换为UPDATE语句:将SELECT ... FROM替换为关键字UPDATE并添加SET子句。

代码语言:javascript
运行
复制
UPDATE ( SELECT f.asc_id
              , f.asc_maincategory
           FROM food f
          WHERE f.asc_id = '10001'
       ) s
  JOIN food t
    ON t.asc_maincategory = s.asc_maincategory
   SET t.asc_maincategory = 'fruits'
     , t.asc_subcategory  = IF(t.asc_id=s.asc_id,'oranges',t.asc_subcategory)

一个重要的和(有点相关的)最后一个注释:

切勿将可能不安全的值合并到SQL文本中。

使用带有绑定占位符的预准备语句,或正确转义值,以使它们可以安全地包含在SQL中。

一个母亲的功绩(小波比表):https://xkcd.com/327/

OWASP SQL注入:https://www.owasp.org/index.php/SQL_Injection

票数 0
EN

Stack Overflow用户

发布于 2017-11-28 13:37:42

您可以通过使用CASE来实现这一点。WHEN...THEN。

代码语言:javascript
运行
复制
UPDATE food 
SET asc_subcategory = CASE
        WHEN asc_subcategory = 'orange' THEN 'oranges'
        ELSE asc_subcategory END,
    asc_maincategory = CASE
        WHEN asc_maincategory = 'fruit' THEN 'fruits'
        ELSE asc_maincategory
    END;

如果asc_subcategory='orange',则将其更新为橙色,否则从数据库中获取相同的值。

如果asc_maincategory='fruit',则从DB中将其更新为fruits相同的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47524005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档