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

Базы данных

БГУИР, ПОИТ

 

 

6.7. Оператор INSERT

6.7.1. Общая структура оператора INSERT

Как и в случае с оператором UPDATE, мы не будем рассматривать подробно фрагменты, эквивалентные аналогичным фрагментам оператора SELECT.

Оператор INSERT поддерживает три варианта синтаксиса:

6.7.2. Классический вариант синтаксиса INSERT

Данный вариант оператора INSERT является наиболее часто используемым, «классическим», потому основную информацию об INSERT мы будем рассматривать именно на примере этого синтаксиса.

Стр: 226/248

Базы данных

БГУИР, ПОИТ

 

 

6.7.3. INSERT: DELAYED

Ключевое слово DELAYED позволяет реализовать поведение, при котором добавляемые записи помещаются в буфер на стороне сервера, а клиент может немедленно продолжить работу, не дожидаясь фактического завершения запроса.

Записи переносятся из буфера в таблицу в моменты, когда отсутствуют конфликты, вызванные блокировкой таблицы другими операциями.

См. подробности здесь: http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

6.7.4. INSERT: [INTO] …

Это – основная часть оператора INSERT, указывающая поля, в которые производится вставка, и соответствующие значения.

Примечание: слова VALUE и VALUES – синонимы.

Рассмотрим пример – добавим в таблицу товаров два тестовых товара.

Таблица до вставки

Таблица после вставки

 

 

Запрос

INSERT INTO `goods`

(`g_id` , `g_cat` , `g_name` , `g_price` , `g_quantity` , `g_top`) VALUES

(NULL , '1', 'Test1', '700', '10', b'0‘ ), Можно добавлять и одну строчку .

(NULL , '2', 'Test2', '800', '20', b'0‘ )

Автоинкрементируемый PK.

Поле типа BIT.

Стр: 227/248

Базы данных

БГУИР, ПОИТ

 

 

Q: Только что мы использовали синтаксис INSERT, где за один раз добавляли несколько строк. А зачем? И сколько всего строк можно добавить за раз?

A: Вставка нескольких строк одной командой работает быстрее. Всего за один раз можно вставить столько строк, сколько «влазит в длину запроса». Никаких ограничений по количеству добавляемых строк (или значений) нет.

Единственное ограничение – значение max_allowed_packet, см. подробности здесь:

http://dev.mysql.com/doc/refman/5.1/en/server-system- variables.html#sysvar_max_allowed_packet

6.7.5. INSERT: ON DUPLICATE KEY UPDATE

Данная секция описывает поведение СУБД в случае, если в процессе вставки данных произошло дублирование первичного ключа или уникального индекса.

Также рекомендуется почитать: http://habrahabr.ru/post/156489/

Пример: в таблицу товаров (PK(`g_id`)) добавим товар так, чтобы это привело к дублированию PK.

Исходная таблица

 

Запрос

 

Результат

 

 

INSERT INTO `goods`

 

 

 

 

(`g_id` , `g_cat` ,

 

 

 

 

`g_name` , `g_price` ,

 

 

 

 

`g_quantity` , `g_top`)

 

 

 

 

VALUES

 

 

 

 

(1 , '1', 'Test1',

 

 

 

 

'700', '10', b'0')

 

 

 

 

ON DUPLICATE KEY UPDATE

 

 

 

 

`g_id` = `g_id` + 1

 

 

Т.е. попытка заставить MySQL циклически обновлять ключ, пока не будет устранено совпадение, не работает.

Стр: 228/248

Базы данных

БГУИР, ПОИТ

 

 

Это вполне логично, т.к. ON DUPLICATE KEY UPDATE предназначено для обновления неключевых полей в случае совпадения ключевых. Т.е. для выполнения запросов вида:

Запрос

Результат (фрагмент)

INSERT INTO `goods`

(`g_id` , `g_cat` , `g_name` , `g_price` , `g_quantity` , `g_top`)

VALUES (1 , '1', 'NewName', '10', '1', b'0') ON DUPLICATE KEY UPDATE

`g_cat` = '1', `g_name` = 'NewName', `g_price` = 10,

`g_quantity` = 1, `g_top` = b'0'

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

1.Внимательно изучить: http://dev.mysql.com/doc/refman/5.5/en/insert-on- duplicate.html

2.Поискать альтернативные решения, которые, возможно, окажутся более логичными и устойчивыми.

6.7.6. INSERT: [IGNORE]

Как и в случае оператора UPDATE, оп-

ция IGNORE позволяет игнорировать ошибки (дупликация ключей, некорректные данные и т.п.), переводя их в разряд предупреждений.

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

Стр: 229/248

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