哪些数据库可以运行以下SQL?

meu*_*rus 3 mysql sql database

我构建了一个查询,我想知道它是否适用于MySQL以外的任何数据库.我从来没有真正使用过其他数据库,所以我对这些差异并不满意.

UPDATE `locks` AS `l1`
  CROSS JOIN (SELECT SUM(`value`) AS `sum` FROM `locks`
              WHERE `key` IN ("key3","key2")) AS `l2`
SET `l1`.`value` = `l1`.`value` + 1
WHERE `l1`.`key` = "key1" AND (`l2`.`sum` < 1);
Run Code Online (Sandbox Code Playgroud)

以下是我所依赖的具体功能(我可以想到它们):

  1. 更新查询.
  2. 加入更新查询.
  3. 聚合非明确分组查询中的函数.
  4. 在哪里......在条件.

我相信人们会好奇这是做什么的,这也可能包括可能无处不在的数据库功能.这是使用数据库进行互斥的实现,用于Web应用程序.在我的情况下,我需要它,因为某些用户操作导致表被删除并使用不同的列重新创建,我想避免错误,如果应用程序的其他部分尝试插入数据.因此,实现专门用于解决读者 - 作者问题.

此查询假定存在一个locks包含两个字段的表:key(varchar)和value(int).它进一步假设该表包含一行key="key1".然后它尝试增加value"key1".它只会这样做,如果对于key列表中的每一个("key2","key3"),关联的value是0(WHERE条件l2是假设value从不为负的近似值).因此,如果满足某些条件,则该查询仅"获得锁定",可能是以原子方式.然后,应用程序检查它是否通过查询的返回值收到锁定,该返回值可能表示受影响的行数.当且仅当没有行受影响时,应用程序才会收到锁定.

因此,以下是查询本身无法识别的附加条件:

  1. 假设在多线程环境中,此查询的副本永远不会与另一个副本交错.
  2. 处理查询必须返回是否有任何值受到影响.

作为辅助请求,我将非常感谢"标准SQL"上的任何资源.我听说过它,但从来没有找到任何类型的定义,当MySQL文档说"这个功能是标准SQL的扩展"时,我觉得我错过了很多东西.

根据响应,此查询应在所有系统中更好地工作:

UPDATE locks AS l1
  CROSS JOIN (SELECT SUM(val) AS others FROM locks
              WHERE keyname IN ('key3','key2')) AS l2
SET l1.val = l1.val + 1
WHERE l1.keyname = 'key1' AND (l2.others < 1);
Run Code Online (Sandbox Code Playgroud)

由于好的答案,为每个人提供支持.标记的答案旨在直接回答我的问题,即使只针对另一个DBMS,即使可能有更好的解决方案来处理我的特定问题(甚至一般的跨平台SQL问题).

Qua*_*noi 6

这种确切的语法只适用于MySQL.

对于这个构造来说,这是一个丑陋的解决方法:

UPDATE  locks
SET     value = 1
WHERE   key = 'key1'
        AND NOT EXISTS
        (
        SELECT  NULL
        FROM    locks li
        WHERE   li.key IN ('key2', 'key3')
                AND li.value > 0
        )
Run Code Online (Sandbox Code Playgroud)

它适用于所有系统,除非MySQL,因为后者不允许在目标表UPDATE或子DELETE语句中使用子查询.