代码之家  ›  专栏  ›  技术社区  ›  IsmailS

用同一表中另一列的值更新一列

  •  6
  • IsmailS  · 技术社区  · 14 年前

    请考虑以下sql语句

    Create table abc 
    (A int,
    B int
    )
    
    insert into abc values (1,2)
    

    update abc 
    set A = B,
    B =0
    where A=1
    

    update abc 
    set B =0,
    A = B
    where A=1
    

    我想在后来的声明中 B A 列的值设置为 B's 价值

    4 回复  |  直到 14 年前
        1
  •  9
  •   paxdiablo    14 年前

    不,单个update语句是原子的,它们的各个部分没有顺序。

    update abc set A = B, B = 0 where A=1
    update abc set B = 0, A = B where A=1
    

    确切地 同样的事情,因为这两个任务被认为是同时发生的。

    换句话说, B 在…的右边 = B类 .


    附录: 怎么 DBMS实现这种行为取决于编写DBMS的人员的聪明程度。

    例如DBMS 可以 尝试锁定其中的所有行 A 是1,那么,一旦完成了,就执行 A = B , B = 0 (因为执行引擎认为这将满足并发性,所以设置 B类 )在每一排。

    像这样的陈述 set A = B, B = A

    read in oldrow
    copy oldrow to newrow
    newrow.A = oldrow.B
    newrow.B = oldrow.A
    write out newrow
    

    然后它将解锁所有行。

    这只是一个选择。一个非常愚蠢的DBMS可能只会锁定整个数据库文件,尽管这不利于非常智能的并发。

        2
  •  3
  •   Oded    14 年前

    SQL不按字段的顺序计算值。就SQL而言,这些语句是相同的。

    更新发生在一个步骤中(原子的),而不是几个有序的步骤。

    A 现在的 的价值 B 同时 更新 B类

    如果它有助于您理解,您可以将其视为update触发器中发生的事情,update触发器可以访问 DELETED 逻辑表中的新值 INSERTED 逻辑表。

        3
  •  2
  •   onedaywhen    14 年前

    @Ismail答案的变体:从逻辑上讲,更新是一起提交的删除和插入,这就是为什么在每个逻辑表中都有一行 deleted inserted 分别。这里的工作单位是行:当一行被更新时,它被删除并使用新的值重新插入(如果你想知道是哪个值)

    一个有用的助手是

    UPDATE MyTable
       SET A = B, B = A;
    

        4
  •  0
  •   IsmailS    14 年前

    现在我明白了,有两个逻辑表,即 DELETED INSERTED 当我们运行一个Update语句时就会出现。

    所以值被设置为 A 列检索自 B 删除 表和 B类 设置为0的是 桌子。