簡體   English   中英

獲取上次查詢中插入的記錄/獲取更改的行數(MySQL)

[英]Get the inserted records in last query/Get changed rows count (MySQL)

我目前正在將舊的數據庫結構遷移到新的結構。 我正在創建一個 SQL 腳本(因為我可能需要不止一次地執行此操作)並且我卡在了我希望執行的某個操作上。

所以這個腳本的相關表/字段:

狀態-> 舊表,我將在其中獲取標簽記錄

  • ID
  • 默認名稱
  • 色標
  • 狀態

自由職業者-> 舊表

  • idfreelancer
  • (自由職業者信息,很多不重要的領域)
  • 身份狀態

標簽-> 新表,用於存儲標簽(自由職業者可以有多個標簽,標簽可以有多個自由職業者)

  • 標識標簽
  • 姓名
  • 色標
  • 創客

free_labels -> 新表,交叉引用標簽和自由職業者

  • 標識標簽
  • idfreelancer

所以,我想要的是:

  1. 將每個記錄從default_name IS NULL狀態復制到標簽。
  2. default_name IS NULL狀態中刪除每條記錄
  3. 如果一個自由職業者的 state 的 default_name 為 NULL,那么他應該改為 idstate=1 並在 free_labels 表中插入相應的標簽。

對於前 2 點,我提出了查詢:

INSERT INTO labels(name,color_code,idcreator)
SELECT state AS name,color_code,2 AS idcreator FROM states
where default_name IS NULL;

DELETE FROM states WHERE default_name IS NULL;

我已將 idcreator 強制為 2,這是有意為之,我知道這可能看起來很奇怪。


對於第三點,我想使用類似的東西:

INSERT INTO free_labels(idlabel,idfreelancer)
VALUES
((SELECT LAST_INSERT_ID() FROM labels),
(SELECT f.idfreelancer FROM freelancers f, states s,
WHERE f.idstate=s.id AND s.default_name IS NULL))

注意:我還沒有嘗試過這個查詢,所以我什至不知道我是否可以用雙SELECT做一個INSERT INTO

並在從狀態中刪除記錄之前使用此查詢。 但是這個查詢對我來說有兩個問題。

  • 它不會改變自由職業者的狀態,
  • 而且,最重要的是,它會“中斷”多條記錄,因為LAST_INSERT_ID()只會讓我獲得最后插入的記錄。

我對如何執行此操作有點迷茫,我認為這可以通過從查詢中獲取更改記錄的數量來完成,但我不知道是否可以通過 SQL(如果需要,我也可以使用 PHP,不過,我寧願不)。

我考慮過的另一件事是,也許我可以使用JOIN執行INSERT ,因此我會同時在labelsfree_labels中插入記錄。 但同樣,我不知道這對 SQL 是否可行,甚至是否能解決我的問題。

我真的很想避免手動遷移這些記錄......

任何幫助/建議將不勝感激!

因此,首先,您創建一個多列的新標簽表:

CREATE TABLE labels (
  idlabel int PRIMARY KEY AUTO-INCREMENT,
  #Some other columns....
  old_id int
  );

然后你將你的數據插入到這個表中,就像你所做的加上 old_id (並刪除行):

INSERT INTO labels(name,color_code,idcreator,old_id)
  SELECT state AS name,color_code,2 AS idcreator, id AS old_id FROM states
  where default_name IS NULL;

DELETE FROM states WHERE default_name IS NULL;

您現在可以將您的自由職業者 ID 與 free_labels 表中的舊 stateid 進行映射:

INSERT INTO free_labels (idlabels, idfreelancers)
  SELECT labels.idlabel, freelancers.idfreelancer 
  FROM labels 
  JOIN freelancers
  ON labels.old_id = freelancers.idstate;

您現在需要做的就是將自由職業者的 idstate 設置為 1(注意不要有 id=1 的狀態或者說檢查 free_labels 的狀態,否則將其設置為 NULL 或 0),刪除標簽中的列並就是這樣 :

UPDATE freelancers SET idstate = 1 WHERE idfreelancer IN (SELECT idfreelancer FROM free_labels);

ALTER TABLE labels DROP COLUMN old_id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM