Странная ошибка обмена данными происходит при попытке обновить строки в моей таблице из другой таблицы в базе данных MySQL - PullRequest
0 голосов
/ 15 мая 2010

Итак, у меня есть таблица данных длиной 10000 строк. Несколько столбцов в таблице просто описывают информацию об одном из столбцов, а это означает, что только один столбец имеет содержимое, а остальные столбцы описывают местоположение содержимого (это для книги). На данный момент только 6 000 столбцов контента из 10000 строк заполнены его содержимым. Строка содержимого столбца 6-10 000 просто говорит о нуле.

У меня есть другая таблица в БД, содержащая содержимое для строк 6000–10 000, с правильным соответствующим первичным ключом, который (казалось бы) облегчит обновление таблицы 10000 строк.

Я пытался выполнить запрос на обновление, например:

UPDATE table(10,000)
SET content_column = (SELECT content FROM table(6,000-10,000) WHERE table(10,000).id = table(6-10,000.id)

Какой тип работы, единственная проблема состоит в том, что он просто извлекает данные из второй таблицы, но заменяет существующий столбец содержимого на ноль. Таким образом, столбцы содержимого строк 1-6000 становятся нулевыми, а столбцы содержимого строк 6-10,000 имеют правильные значения ... Я все равно подумал, что это довольно странно.

У кого-нибудь есть мысли о том, где я иду не так? Если бы вы могли показать мне лучший запрос SQL, я был бы признателен! Спасибо

1 Ответ

0 голосов
/ 15 мая 2010

Причина в том, что у вас нет предложения Where, поэтому все строки обновляются. Следующий запрос обновит только буксиры, которые существуют в таблице 6K-10K, но все равно перезапишет совпадающие значения.

Update table(10,000)
Set content_column =    (
                        Select content 
                        From table(6,000-10,000) 
                        Where table(10,000).id = table(6-10,000.id)
                        )
Where Exists    (
                Select 1
                From table(6,000-10,000) 
                Where table(10,000).id = table(6-10,000.id)
                )

Другой способ, если вы просто не хотите перезаписывать существующие значения, это использовать Coalesce:

Update table(10,000)
Set content_column =    Coalesce(table(10,000).content_column
                            ,   (
                                Select content 
                                From table(6,000-10,000) 
                                Where table(10,000).id = table(6-10,000.id)
                                ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...