Есть ли быстрый способ обновить множество записей в SQL?

StackOverflow https://stackoverflow.com/questions/1437260

Вопрос

Мне нужно заменить более 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".

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top