Есть ли быстрый способ обновить множество записей в SQL?
-
08-07-2019 - |
Вопрос
Мне нужно заменить более 20 000 имен новыми именами, которые я создал с учетом CodeID. Р>
Например: я должен обновить все строки, которые содержат " собаку " (который имеет кодовый идентификатор 1) с помощью «cat» и обновлять все строки, содержащие «лошадь»; (который имеет кодовый идентификатор 2) с "птицей" и т. д.
Первый оператор SQL: UPDATE animalTable SET cDescription
= " cat " ГДЕ CodeID
= 1
2-й оператор SQL: UPDATE animalTable SET cDescription
= " птица " ГДЕ CodeID
= 2
Эти операторы работают, но мне нужен более быстрый способ сделать это, потому что у меня более 20 000 имен.
Заранее спасибо.
Решение
Это самый быстрый способ сделать это.
Или вы хотите обновить все записи одной командой?
вы можете сделать обновление с объединением (фиксированный синтаксис ... не использовал его некоторое время)
UPDATE animalTable
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID
SET animalTable.cDescription = CodeTable.Description_1;
Другой вариант - разделить обновления на более мелкие партии, это сократит время блокировки таблицы ... Но общее время обновлений займет больше времени (это всего лишь улучшение требуемой производительности). Это можно сделать с помощью обновление только определенных диапазонов идентификаторов в каждом пакете.
Также вы можете хранить эти данные в отдельной таблице. Поскольку данные не нормированы. Отодвиньте его, чтобы он был более нормализованным.
Другие советы
Возможно, вы захотите создать временную таблицу, которая будет содержать значения перевода и обновлять их на основе этого.
Например:
create table #TRANSLATIONS
(
from varchar(32),
to varchar(32)
)
Затем вставьте значения перевода:
insert into #TRANSLATIONS (from,to) values ('cat','dog')
Наконец, обновите на основе этого:
update MYTABLE
set myvalue = t.to
where myvalue = t.from
from MYTABLE m,
#TRANSLATIONS t
(непроверенный, вне головы).
Вы можете использовать оператор CASE , чтобы обновить его
ОБНОВЛЕНИЕ животного набора SET cDescription = CASE codeID КОГДА 1 ТОГДА 'кошка' КОГДА 2 ТОГДА 'птица' .... КОНЕЦ
Предположим, у вас есть такой файл:
1,cat
2,bird
...
Я бы написал скрипт, который читает этот файл и выполняет обновление для каждой строки.
В PHP:
$f = fopen("file.csv","r")
while($row = fgetcsv($f, 1024)) {
$sql = "update animalTable set cDescription = '".$row[1]."' where CodeID = ".$row[0];
mysql_query($sql);
}
fclose($f);
Чтобы ускорить его, вы можете обновить только те записи, у которых еще нет значения, которое вы хотите присвоить.
UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"
При таком подходе команда обновляет только те записи, которые еще не являются "cat".
Отказ от ответственности: я ненавижу кошек.