日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

mysql – 哪些數(shù)據(jù)庫(kù)可以運(yùn)行以下SQL?

 印度阿三17 2019-07-16

我構(gòu)建了一個(gè)查詢,我想知道它是否適用于MySQL以外的任何數(shù)據(jù)庫(kù).我從來(lái)沒有真正使用過(guò)其他數(shù)據(jù)庫(kù),所以我對(duì)這些差異并不滿意.

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);

以下是我所依賴的具體功能(我可以想到它們):

>更新查詢.
>加入更新查詢.
>非顯式分組查詢中的聚合函數(shù).
>在哪里……在條件.

我相信人們會(huì)好奇這是做什么的,這也可能包括可能無(wú)處不在的數(shù)據(jù)庫(kù)功能.這是使用數(shù)據(jù)庫(kù)進(jìn)行互斥的實(shí)現(xiàn),用于Web應(yīng)用程序.在我的情況下,我需要它,因?yàn)槟承┯脩舨僮鲗?dǎo)致表被刪除并使用不同的列重新創(chuàng)建,我想避免錯(cuò)誤,如果應(yīng)用程序的其他部分嘗試插入數(shù)據(jù).因此,該實(shí)施專門用于解決the readers-writers problem.

此查詢假定存在具有兩個(gè)字段的表鎖:key(varchar)和value(int).它進(jìn)一步假設(shè)該表包含一行,使得key =“key1”.然后它嘗試增加“key1”的值.只有當(dāng)列表中的每個(gè)鍵(“key2”,“key3”)時(shí),它才會(huì)這樣做,相關(guān)的值為0(l2的WHERE條件是假設(shè)值永遠(yuǎn)不為負(fù)的近似值).因此,如果滿足某些條件,則該查詢僅“獲得鎖定”,可能是以原子方式.然后,應(yīng)用程序檢查它是否通過(guò)查詢的返回值收到鎖定,該返回值可能表示受影響的行數(shù).當(dāng)且僅當(dāng)沒有行受影響時(shí),應(yīng)用程序才會(huì)收到鎖定.

因此,以下是查詢本身無(wú)法識(shí)別的附加條件:

>假設(shè)在多線程環(huán)境中,此查詢的副本永遠(yuǎn)不會(huì)與另一個(gè)副本交錯(cuò).
>處理查詢必須返回是否有任何值受到影響.

作為輔助請(qǐng)求,我將非常感謝“標(biāo)準(zhǔn)SQL”上的任何資源.我聽說(shuō)過(guò)它,但從來(lái)沒有找到任何類型的定義,當(dāng)MySQL文檔說(shuō)“這個(gè)功能是標(biāo)準(zhǔn)SQL的擴(kuò)展”時(shí),我覺得我錯(cuò)過(guò)了很多東西.

根據(jù)響應(yīng),此查詢應(yīng)在所有系統(tǒng)中更好地工作:

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);

由于好的答案,為每個(gè)人提供支持.標(biāo)記的答案旨在直接回答我的問(wèn)題,即使只針對(duì)另一個(gè)DBMS,即使可能有更好的解決方案來(lái)處理我的特定問(wèn)題(甚至一般的跨平臺(tái)SQL問(wèn)題).

解決方法:

對(duì)于PostgreSQL

1) Update queries.

無(wú)法想象沒有UPDATE的RDBMS. (?)

2) Joins in update queries.

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

3) Aggregate functions in non-grouped queries.

在PostgreSQL中不可能.使用子查詢,CTE或Window函數(shù).
但是您的查詢已分組. GROUP BY子句沒有拼寫出來(lái).這也適用于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.

(Quote from the manual).

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(多版本并發(fā)控制)在處理并發(fā)性方面優(yōu)于MySQL.然而,在這方面,大多數(shù)RDBMS都優(yōu)于MySQL.

Processing the query must return whether any values were affected.

Postgres就是這樣做的,大多數(shù)RDBMS都這樣做.

此外,此查詢不會(huì)在PostgreSQL中運(yùn)行,因?yàn)椋?/p>

>沒有反叛的identifiers(這是MySQL俚語(yǔ)).
>值必須是單引號(hào),而不是雙引號(hào).

list of reserved words in Postgres and SQL standards.
A combined list for various RDBMS.

來(lái)源:https://www./content-2-333901.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多