2010-06-09 5 views
14

Я пишу приложение, и я использую MySQL в качестве СУБД, мы загружаем предложения о свойствах и возникали некоторые проблемы с производительностью. Старая архитектура выглядела так: Свойство обновляется. Если число затронутых строк не равно 1, то обновление не считается успешным, так как запрос обновления решает нашу проблему. Если обновление не увенчалось успехом, а число затронутых строк больше 1, у нас есть дубликаты, и мы удалим их все. После удаления дубликатов при необходимости, если обновление не было успешным, произойдет вставка. Эта архитектура работала хорошо, но были некоторые проблемы с скоростью, поскольку свойства удаляются, если они не обновлялись в течение 15 дней. Теоретически основная проблема заключается в удалении свойств, поскольку некоторые свойства живы в течение нескольких месяцев, а индексы очень далеки друг от друга (мы говорим о 500, 000+ свойствах).Заменяет ли предложение where?

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

replace into table_name(column1, ..., columnn) values(value1, ..., valuen) where ID = idValue 

Конечно, я рассчитывается idValue и обрабатываются все, но у меня была ошибка синтаксиса. Я хотел бы знать, если я ошибаюсь, и есть предложение where для замены.

Я нашел альтернативное решение, которое даже лучше, чем заменить на (используя просто запрос на обновление), потому что удаление происходит за занавесками, если я использую замену, но я хотел бы знать, если я ошибаюсь когда я говорю, что замена в не имеет предложения where. Для получения дополнительной справки смотрите по этой ссылке:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

Спасибо за ответы заранее, Лайош Арпад

ответ

0

В вашей ссылке документации, они показывают три альтернативных форм команд replace. Несмотря на то, что исключено, единственное, что может принять предложение where, является третьей формой с завершающим select.

replace Похоже, что излишний излишек относительно update, если я правильно понимаю вашу задачу.

+0

Большое спасибо за ваш ответ. На самом деле это излишний, вы абсолютно правы, я просто хочу знать, есть ли вложение в предложение where, чтобы отфильтровать, что заменить, потому что наш хост сказал, что имеет, и я хотел бы прояснить вопрос (если я уже нашел из этого я не вижу причины, чтобы не сказать ему) ЗАМЕНИТЕ [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name, ...)] SELECT ... Если я правильно понял, приведенный выше синтаксис, где вы говорите, что может появиться. Вы правы в этом, однако предложение where находится в select –

+0

И замена в не имеет места в примере, поэтому, я думаю, что замена в не имеет места. –

22

Я вижу, что вы решили проблему, но ответить на исходный вопрос:

REPLACE INTO делает не есть пункт WHERE.

Синтаксис REPLACE INTO работает точно как INSERT INTO за исключением того, что любые старые строки с одинаковым первичным или уникальным ключом автоматически удаляются перед вставкой новой строки.

Это означает, что вместо предложения WHERE вы должны добавить первичный ключ к значениям, заменяемым для ограничения вашего обновления.

REPLACE INTO myTable (
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 

... предоставит тот же результат, что и ...

UPDATE myTable 
SET myColumn1 = 'value1', myColumn2 = 'value2' 
WHERE myPrimaryKey = 100; 

... или точнее:

DELETE FROM myTable WHERE myPrimaryKey = 100; 
INSERT INTO myTable(
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 
+1

Да, я сделал это. Я запустил aa-запрос, чтобы найти «хорошую» строку и обновил эту строку, таким образом у меня было решение, но после того, как я это решил, мне было очень любопытно, действительно ли то, что мне было сказано, и на основе ответы отсюда и моих исследований (опробовать вещи), заменить на отсутствие предложения where, так что заменить на это на delete + insert, поэтому мои индексы по-прежнему не будут оптимизированы. Я просто нуждался в обновлении. В любом случае, спасибо за ваш ответ. –

+0

спасибо Ivar. Самые полезные – khaverim

Смежные вопросы