Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
conspect.pdf
Скачиваний:
374
Добавлен:
17.03.2016
Размер:
27.86 Mб
Скачать

Базы данных

БГУИР, ПОИТ

 

 

6.8. Оператор REPLACE

6.8.1. Общая структура и назначение оператора REPLACE

Продолжаем ту же логику, т.е. не рассматриваем повторно уже рассмотренное. В случае оператора REPLACE нам повезло – мы уже рассматривали ВСЕ его фрагменты.

Тем не менее, краткий обзор структуры сделаем. Поддерживается три варианта синтаксиса:

При использовании оператора REPLACE СУБД проверяет первичные ключи

иуникальные индексы на совпадение со значениями в новой записи:

если есть совпадение – имеющаяся строка удаляется, а новая вставляется (при этом значение автоинкрементируемого ключа не увеличивается);

если совпадений нет – просто вставляется новая строка.

6.8.2. Области применения и пример использования REPLACE

Допустим, у нас есть таблица-лог, в которой хранится время последнего обращения к ресурсу с некоторого ip-адреса. Здесь логично использовать именно

REPLACE:

REPLACE `visits` SET `ip`='127.0.0.1'

PK

Оператор REPLACE применяется в тех случаях, когда нам важно конечное состояние данных, и при том НЕ важно, были ли уже некие данные в таблице или они попадают туда впервые. Примеры реальных задач:

Импорт данных с обновлением имеющихся.

Показ сообщений в стиле «Вы посещали сайт последний раз с ip такого-то в такое-то время».

Агрегация и кэширование, когда надо {либо впервые подготовить данные, либо обновить существующие}.

Стр: 233/248

Базы данных

БГУИР, ПОИТ

 

 

6.8.3.Области применения и пример использования REPLACE

Q:Как узнать, была ли замена (т.е. удаление и вставка) или вставка записи?

A: По количеству affected_rows (2 или 1). Внимание! Если вы использовали REPLACE с 2+ наборами значений, этот способ «не работает», т.к. если вы получили, например, affected_rows = 3 при передаче двух значений, то была одна вставка и одна замена, но какая запись была вставлена, а какая – заменена, выяснить уже нельзя. Впрочем, чаще всего, и не нужно .

Q: Какие триггеры и в какой последовательности срабатывают при использовании

REPLACE?

A:Такие и в такой:

before insert

[before delete]

[after delete]

after insert

Q: Работает ли REPLACE быстрее, чем UPDATE?

A: Нет. Даже медленнее (т.к. происходит DELETE + INSERT).

ВНИМАНИЕ! Если вы пытаетесь обновить данные в родительской таблице, у которой проставлена каскадная операция удаления на дочернюю, возможны фатальные последствия!

Как только в родительской таблице произойдёт операция удаления записи, автоматически каскадно удалятся записи из дочерней таблицы.

6.8.4. Краткий итог по REPLACE

Чётко отдавайте себе отчёт в том, ЧТО вы хотите сделать:

Если вам надо гарантированно ДОБАВИТЬ строку – используйте INSERT.

Если вам нужно гарантированно ИЗМЕНИТЬ строку – используйте UPDATE.

Если вам нужно (в зависимости от наличия строки) ИЛИ добавить её, ИЛИ изменить – используйте REPLACE.

Помните, что REPLACE == DELETE + INSERT. Со всеми вытекающими последствиями!

Стр: 234/248

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]