Есть ли быстрый способ обновить множество записей в SQL? - PullRequest
3 голосов
/ 17 сентября 2009

Мне нужно заменить более 20 000 имен новыми именами, которые я создал, учитывая кодовый идентификатор.

Например: я должен обновить все строки, содержащие «dog» (у которого CodeID равен 1), «cat», а все строки, содержащие «horse» (у которого CodeID 2), - «bird». и т. д.

1-й оператор SQL: UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1

2-й оператор SQL: UPDATE animalTable SET cDescription = "птица" ГДЕ CodeID = 2

Эти утверждения работают, но мне нужен более быстрый способ сделать это, потому что у меня более 20 000 имен.

Заранее спасибо.

Ответы [ 5 ]

7 голосов
/ 17 сентября 2009

Это самый быстрый способ сделать это.

Или вы хотите обновить все записи одной командой?

вы можете сделать обновление с объединением (фиксированный синтаксис ... Не использовал это время)

UPDATE animalTable 
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID 
SET animalTable.cDescription = CodeTable.Description_1;

Другой вариант - разделить обновления на более мелкие партии, это сократит время блокировки таблицы ... Но общее время обновлений займет больше времени (это всего лишь улучшение требуемой производительности). Это можно сделать с помощью обновление только определенных диапазонов идентификаторов в каждом пакете.

Также вы можете хранить эти данные в отдельной таблице. Поскольку данные не нормированы. Отодвиньте его, чтобы он был более нормализованным.

4 голосов
/ 17 сентября 2009

Возможно, вы захотите создать временную таблицу, которая будет содержать значения перевода и обновлять на основе этого.

Например:

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

(Не проверено, с макушки головы).

1 голос
/ 17 сентября 2009

Предположим, у вас есть такой файл:

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);
1 голос
/ 17 сентября 2009

Вы можете использовать оператор CASE для его обновления

ОБНОВЛЕНИЕ животного набора SET cDescription = КОД ИДЕНТИФИКАЦИИ КОГДА 1 КОГДА «КОТ» КОГДА 2 ТОГДА «ПТИЦА» .... КОНЕЦ

0 голосов
/ 09 июля 2015

Чтобы ускорить его, вы можете обновить только те записи, которые еще не имеют значения, которое вы хотите присвоить.

UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"

При таком подходе команда обновляет только те записи, которые еще не являются 'cat'.

Отказ от ответственности: я ненавижу кошек.

...