在mysql数据库中 以下sql_mysql – 哪些数据库可以运行以下SQL?

我构建了一个查询,我想知道它是否适用于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);

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

>更新查询.

>加入更新查询.

>非显式分组查询中的聚合函数.

>在哪里……在条件.

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

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

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

>假设在多线程环境中,此查询的副本永远不会与另一个副本交错.

>处理查询必须返回是否有任何值受到影响.

作为辅助请求,我将非常感谢“标准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);

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

解决方法:

对于PostgreSQL

1) Update queries.

无法想象没有UPDATE的RDBMS. (?)

2) Joins in update queries.

在PostgreSQL中,您将包含FROM from_list的其他表.

3) Aggregate functions in non-grouped queries.

在PostgreSQL中不可能.使用子查询,CTE或Window函数.

但是您的查询已分组. GROUP BY子句没有拼写出来.这也适用于PostgreSQL.

The presence of HAVING turns a query into a grouped query even if

there is no GROUP BY clause. This is the same as what happens when the

query contains aggregate functions but no GROUP BY clause.

4) WHERE…IN condition

适用于我所知道的任何RDBMS.

“Additional conditions”: Assumes that in a multi-threaded environment, a copy of this query will never be interleaved with another copy.

PostgreSQL的multiversion model MVCC(多版本并发控制)在处理并发性方面优于MySQL.然而,在这方面,大多数RDBMS都优于MySQL.

Processing the query must return whether any values were affected.

Postgres就是这样做的,大多数RDBMS都这样做.

此外,此查询不会在PostgreSQL中运行,因为:

>没有反叛的identifiers(这是MySQL俚语).

>值必须是单引号,而不是双引号.

https://www.icode9.com/content-2-333901.html

你可能感兴趣的:(在mysql数据库中,以下sql)