Update

一次更新多行的非鍵 ID 列

  • May 19, 2017

我繼承了在 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....

Sql 小提琴

您可以使用最大值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 |

引用自:https://dba.stackexchange.com/questions/173716