Mysql

UPDATE 表 IF 數據在另一個

  • December 14, 2021

我想從另一個表中檢索一些數據並將其放入我的第一個表中。

我使用了這個查詢:

UPDATE table_1 SET table_1.firstname = 
(
 SELECT 
   firstname 
 FROM table_2 
 WHERE table_2.lastname = table_1.lastname LIMIT 1
);

但是這個請求超時了,因為我有將近 300k 行table_1

我嘗試只更新一條記錄中的一個欄位,如下所示:

UPDATE table_1 SET table_1.firstname = 
(
 SELECT 
   firstname 
 FROM table_2 
 WHERE table_2.lastname = "toto" LIMIT 1
);

但我得到了:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

我想知道我的請求是否可以更高效、更快?

Edit_1:我不能準確地放置表的結構,但我用我在查詢中使用的範例來表示它:

*************************** 1. row ***************************
      Table: table_1
Create Table: CREATE TABLE `table_1` (
 `lastname` varchar(9) NOT NULL,
 `firstname` varchar(14) DEFAULT NULL,
 PRIMARY KEY (`lastname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


*************************** 1. row ***************************
      Table: table_2
Create Table: CREATE TABLE `table_2` (
 `lastname` varchar(9) CHARACTER SET latin1 NOT NULL,
 `firstname` varchar(14) CHARACTER SET latin1 NOT NULL,
 PRIMARY KEY (`firstname`),
 KEY `lastname` (`lastname`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

我認為還有另一個問題,因為即使我沒有循環超過 300k 行,我也會超時。

這裡 table_1 中的記錄數:260905 和 table_2 中的記錄數:32,165124

因為您使用的是相關子查詢,正如 Akina 所提到的,它可能會導致對您的整個表(如果我沒看錯的話是 32,165,124 行)發生掃描操作。您最好以更相關的方式編寫查詢,這可以通過 來實現INNER JOIN,例如:

UPDATE table_1
INNER JOIN table_2
 ON table_1.lastname = table_2.lastname
SET table_1.firstname = table_2.firstname 

INNER JOIN只會生成一個結果集,其中數據存在於兩個表中,用於子句中連接的欄位ON。因此,只有存在於table_2其中並與之匹配table_1lastname行將用於UPDATE並且可能會導致更有效的查找操作。

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