iT邦幫忙

0

sql 表大量更新

  • 分享至 

  • xImage

我有一筆資料庫裡面要更新 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 "條件";

可是我發現到這只能單一個更新,有沒有方法可以一次替換所以更新的資料?

看更多先前的討論...收起先前的討論...
外獅佬 iT邦大師 1 級 ‧ 2015-08-12 09:50:44 檢舉

sql 表大量更新


2000多筆


落寞落寞真的...好多囧

外獅佬 iT邦大師 1 級 ‧ 2015-08-12 09:51:35 檢舉
既然資料已經整理好,不如砍掉重練
truncate table + BCP
把Table結構,資料,想要達成的結果放上來.
我們又看不到你那裡,也不知道你內心想什麼.....
ilove1989 iT邦新手 5 級 ‧ 2015-08-12 10:45:30 檢舉
對我來說很多...哭
你補充那些.....
先建一個Table,把資料放到新的Table,測試用新的Table來測啊.
你不把資料這些說清楚,令人無法著手啊...
daimom iT邦新手 2 級 ‧ 2015-08-12 13:09:41 檢舉
以前曾經幹過類似的事,樓主都用excel弄好了.那何不再用sql組一下update字串。
然後整批丟去執行。記得加分號。
不多啊,我之前都是用 NAVICAT 倒資料,幾千筆都一次弄完,先備份,有問題再弄回來
不過,要有經驗會比較保險
Ethan Jhuang iT邦研究生 3 級 ‧ 2015-08-13 22:11:45 檢舉
感覺很像鼎新XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
外獅佬
iT邦大師 1 級 ‧ 2015-08-12 11:57:00

以下的作法是針對SQL Server處理的:

  1. 先做好資料庫備份,以免發生悲劇。

  2. 新開一個資料結構一模一樣的新資料表

  3. 把整理好的資料匯入到這個新資料表

  4. 使用以下的方式將新資料表的資料更新到原始資料表(利用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

4
wiseguy
iT邦超人 1 級 ‧ 2015-08-12 14:23:23

以下是針對 MySQL/MariaDB 處理的:

  1. 建立新 Table INVBA2

    <pre class="c" name="code">create table INVBA2 like INVBA;

  2. 將 Excel 資料存成 CSV 檔,直接匯入 INVBA2

    <pre class="c" name="code">LOAD DATA LOCAL INFILE 'file_name.csv' INTO TABLE INVBA2;

  3. 把 INVBA 剩下的資料倒過去 INVBA2,重覆的資料就忽略

    <pre class="c" name="code">insert IGNORE into INVBA2 (欄位) select * from INVBA;

重點是兩個table的primary key 要一樣,要不然你想改的資料會變成新舊都有。

我要發表回答

立即登入回答