我有一筆資料庫裡面要更新 2000多筆的資料
資料庫表單為名為INVBA
內容為
MB001,MB002,MB003
10001,物品1,規格1
10002,物品2,規格2
10003,物品3,規格3
現在想要更新成
資料庫表單為名為INVBA2
MB001,MB002,MB003
10001,物品9,規格6
10002,物品8,規格5 (要更新的表格已經事先用excel弄好了)
10003,物品7,規格4
我google 到
UPDATE "表格名"
SET "欄位1" = [新值]
WHERE "條件";
可是我發現到這只能單一個更新,有沒有方法可以一次替換所以更新的資料?
sql 表大量更新
2000多筆
真的...好多
以下的作法是針對SQL Server處理的:
先做好資料庫備份,以免發生悲劇。
新開一個資料結構一模一樣的新資料表
把整理好的資料匯入到這個新資料表
使用以下的方式將新資料表的資料更新到原始資料表(利用CURSOR)
<pre class="c" name="code">
use [你的資料庫];
-- 定義輸出變數
DECLARE @f1 nchar(10),@f2 nchar(10),@f3 nchar(10);
-- 定義CURSOR,請自己改FOR後面的select敘述
DECLARE cur1 CURSOR FORWARD_ONLY FOR (SELECT [f1],[f2],[f3] FROM [Table_2]);
-- 開啟CURSOR
OPEN cur1;
-- 讀取第一筆資料
FETCH NEXT FROM cur1 INTO @f1,@f2,@f3
-- 檢查CURSOR是否已經到達資料尾端,沒有就持續讀取資料
WHILE @@FETCH_STATUS=0
BEGIN
-- 更新資料
UPDATE [Table_1] SET [f2]=@f2,[f3]=@f3 WHERE [f1]=@f1;
-- 繼續讀取資料
FETCH NEXT FROM cur1 INTO @f1,@f2,@f3;
END
以下是針對 MySQL/MariaDB 處理的:
建立新 Table INVBA2
<pre class="c" name="code">create table INVBA2 like INVBA;
將 Excel 資料存成 CSV 檔,直接匯入 INVBA2
<pre class="c" name="code">LOAD DATA LOCAL INFILE 'file_name.csv' INTO TABLE INVBA2;
把 INVBA 剩下的資料倒過去 INVBA2,重覆的資料就忽略
<pre class="c" name="code">insert IGNORE into INVBA2 (欄位) select * from INVBA;
重點是兩個table的primary key 要一樣,要不然你想改的資料會變成新舊都有。