Update
一次更新多行的非鍵 ID 列
我繼承了在 Webdev18 上執行的設計不佳的數據庫。
大多數表在數據庫級別不相關,而是在程式碼中相關。
我應該在一些表中插入和更新新值,但是,由於設計不佳,我正在處理的表沒有明確的主鍵,而是使用沒有實現唯一性
id
的列。-------------- id |name|year| --------------- 1 |Carine|2016 2 |Karl |2016 3 |Prince|2016 4 |Deo |2016 ---------------
id通過每個插入的程式碼填充,並且不會自動遞增。該函式計算目前 Max() 並將其遞增 1。預設值為 O。
每年,我們都應該登記包括上一年的患者在內的患者仍然存在。到目前為止,這是通過使用者的應用程序完成的,這很麻煩並且沒有增加任何附加值。
因此,每年都會創建同一患者的新記錄,從而導致 id 重複。
-------------- id |name|year| --------------- 1 |Carine|2016 2 |Karl |2016 3 |Prince|2016 4 |Deo |2016 0 |Carine|2017 0 |Prince|2017 ---------------
我將使用新值更新新行id,結果如下:
-------------- id |name|year| --------------- 1 |Carine|2016 2 |Karl |2016 3 |Prince|2016 4 |Deo |2016 5 |Carine|2017 6 |Prince|2017 ---------------
但是,我這樣做有以下限制:
約束
不能使用的方法:
- 沒有程式碼更新、重寫和触發器被添加到表中。
- SQL 查詢命令界面中不允許循環構造。
- SQL Query 命令界面中沒有變數聲明。
關係型數據庫管理系統
WebDev 18 - HyperfileSQL
因此,是否有可能在上述限制條件下通過簡單地使用
INSERT INTO ... SELECT FROM...
.
您可以使用最大值
id
並添加到每個 id。這可能會產生很多差距。如果 DBMS 具有視窗功能(如實現),則可以避免這種ROW_NUMBER()
情況:INSERT INTO tableX (id, name, year) SELECT m.maxid + t.id, -- m.maxid + ROW_NUMBER() OVER (ORDER BY t.id), t.name, 2017 FROM ( SELECT MAX(id) AS maxid FROM tableX ) AS m CROSS JOIN mytableX AS t WHERE t.year = 2016 ;
為什麼不簡單地使用現有的不安全(並發)技術
select max(id) + 1
呢?insert into Patients(id, `Name`, `year`) select id + (select max(id) + 1 from Patients), `Name`, `year`+1 from Patients;
?
結果是
| id | Name | year | |----|--------|------| | 0 | Carine | 2016 | | 1 | Karl | 2016 | | 2 | Prince | 2016 | | 3 | Carine | 2017 | | 4 | Karl | 2017 | | 5 | Prince | 2017 |