我有一個 Postgres 表,她有一個訂單視圖欄位,我正在使用 Nodejs 和 express
此訂單視圖的型別為 INTEGER,并具有 NOT NULL 和 UNIQUE 的約束
插入新記錄可能會帶來問題,因為,如果現有記錄的視圖順序為 [1, 2, 3, 4, 5],而新記錄的順序視圖為 4,則當前的 4必須改成5,當前的5必須改成6
(我從前端強制此訂單視圖為連續數字)
我希望在服務器端執行此插入程序(更新現有記錄的訂單視圖)
我想到的是在終點執行一個回圈,通過讀取訂單視圖大于或等于新的記錄,并將其更新為 (current 1)
另一個問題是另一個表中的相關記錄,但我認為可以通過級聯更新來進行
有人能找出一個 SQL 陳述句來完成它而不必對該回圈進行編程嗎?
拉斐爾
uj5u.com熱心網友回復:
在 SQL 中幾乎不需要執行任何型別的“回圈”——您只需要考慮您正在使用的行集,以及它們的共同點。
在這種情況下:
- order_view 小于 4 的行不需要更改
- order_view 為 4 或更高的行需要增加 1,以“騰出空間”
所以SQL真的很簡單:
UPDATE some_table
SET order_view = order_view 1
WHERE order_view >= 4
uj5u.com熱心網友回復:
您可以在單個陳述句中完成插入和更新。但首先您需要(很可能)更改唯一約束以使其可延遲。
alter table <table name>
drop constraint if exists <order view constraint name>;
alter <table name>
add constraint <order view constraint name>
unique(order_view)
deferrable initially deferred;
Postgres 在 cte 中允許 DML,因此現在您可以撰寫 SQL 陳述句來完成這兩個操作:
with updt as
( update <table name>
set order_view = order_view 1
where order_view >= :new_order_view
)
insert into test (order_view, <other columns list>)
values (:new_order_view, <other columns list values>);
其中 <...> 是適當的名稱/值。見演示。以上也可以用作 SQL 程序 - 也在演示處理插入作為最后一項自動設定適當的值。雖然是一個程序,但它仍然只是單個 SQL 陳述句,因此可以將其拉出并獨立運行。
缺點:
- Order_view 指定為 0。結果將重新排序導致跳過 Order_view = 1。
- Order_view 指定 > 當前 Max 1。結果按規定存盤,從而產生間隙。
- 受制于多個用戶的競爭條件。由于是所有基于MAX 1分配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/366987.html
標籤:sql 节点.js PostgreSQL的 表达
