Полям, которые не указаны в списке, автоматически присваивается значение по умолчанию. Рассмотрим это на следующем примере.
Листинг 9.9.
mysql> CREATE TABLE forums (name VARCHAR(150) NOT NULL, category VARCHAR(50) DEFAULT 'UNIX' NOT NULL, postsperpage SMALLINT DEFAULT 15 NOT NULL, highlightColor VARCHAR(10) DEFAULT 'red' NOT NULL);
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO forums (name) VALUES ('Apache');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO forums (name, highlightColor) VALUES ('Sendmail', 'green'); Query OK, 1 row affected (0.00 sec)
Работа с полями, объявленными с модификатором default
Работа с полями, объявленными с модификатором default
Начиная с версии 4.0.3, MySQL также поддерживает новое ключевое слово DEFAULT, которое указывает на использование для данного поля записи значения по умолчанию.
Листинг 9.10.
mysql> INSERT INTO forums (name, category, postsperpage,
highlightColor) VALUES ('MySQL', DEFAULT, DEFAULT, DEFAULT);
Query OK, 1 row affected (0.01 sec)
Работа с полями, объявленными с ключевым словом autoincrement
Использование столбцов с ключевым словом AUTOINCREMENT, позволяет не указывать имя такого поля в операторах INSERT. При этом MySQL "знает", что нужно вставлять следующее по порядку число. Такое число может служить первичным ключом в вашей таблице. Рассмотрим следующий пример, в котором будет проиллюстрирована таблица со столбцом AUTOINCREMENT в качестве первичного ключа,
Листинг 9.11.
mysql> CREATE TABLE users (uid TINYINT(4) NOT NULL AUTO_INCREMENT, uname varchar(8) NOT NULL DEFAULT '', upass VARCHAR(l5) NOT NULL
DEFAULT '', PRIMARY KEY (uid));
Query OK, 0 rows affected (0.08 sec)
а затем заполним его данными. Листинг 9.12.
mysql> INSERT INTO users (uname, upass) VALUES ('jim', PASSWORD('secret'));
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO users (uname, upass) VALUES ('sarah', PASSWORD('opensesame'));
Query OK, 1 row affected (0.02 sec)
mysql> INSERT INTO users (uname, upass) VALUES ('tim', PASSWORD('whiteboard'));
Query OK, 1 row affected (0.00 sec)
В каждой записи в поле uid будет автоматически добавлено следующее по порядку число.
Работа с полями, объявленными с модификатором default
Работа с полями, объявленными с ключевым словом UNIQUE
При добавлении записей с повторяющимися значениями поля, объявленного как UNIQUE, можно проследить, каким образом MySQL обрабатывает эту ситуацию: пропускает операцию вставки, аварийно завершает действие или модифицирует старую запись с новыми значениями при использовании ключевого слова IGNORE или предложения ON DUPLICATE KEY UPDATE.
Для того чтобы лучше это понять, рассмотрим следующую таблицу, которая содержит в поле id уникальный ключ.
Работа с полями, объявленными с модификатором default
Обычно при попытке добавления записи, нарушающей ограничение по уникальности, MySQL аварийно завершает операцию с сообщением об ошибке.
Листинг 9.15.
mysql> INSERT INTO menu (id, label, url) VALUES (4, 'Contact Us',
'contactus.html');
ERROR 1062: Duplicate entry '4' for key 1
При добавлении к оператору INSERT ключевого слова IGNORE, MySQL даже не попытается выполнить этот оператор, если он обнаружит, что нарушается ограничение по уникальности. Поэтому, несмотря на то, что этот оператор не возвращает сообщения об ошибке,
Листинг 9.16.
mysql> INSERT IGNORE INTO menu (id, label, url) VALUES (4, 'Contact
Us', 'contactus.html');
Query OK, 0 rows affected (0.01 sec)
данные останутся неизменными.
Работа с полями, объявленными с модификатором default
Долой все старое ...
Команда REPLACE, имеющая тот же синтаксис, что и команда INSERT, не сильно отличается от предложения ON DUPLICATE KEY UPDATE. Однако в отличие от команды INSERT, которая выдает диагностическое сообщение в том случае, если в добавленной записи повторяется значение в поле, обозначенное как UNIQUE, по команде REPLACE заменяется вся запись с новыми значениями.
Различие между ON DUPLICATE KEY UPDATE и REPLACE заключается в том, что если первая обновляет только указанные поля, то вторая сначала удаляет старую запись, а затем добавляет вместо нее полностью новую запись.
Ключевое слово IGNORE может пригодиться при необходимости выполнять несколько операторов INSERT последовательно. Такая конструкция оператора гарантирует обязательное выполнение всей цепочки операторов INSERT даже в том случае, если один из них содержит повторяющиеся значения и прерывания выполнения всей операции не происходит.
В такой ситуации, начиная с версии 4.1 можно автоматически преобразовать команду INSERT в команду UPDATE путем прибавления предложения ON DUPLICATE KEY UPDATE. За этим предложением должен следовать перечень модифицируемых полей в форме, которая соответствует синтаксису команды UPDATE. Рассмотрим следующий пример.
Листинг 9.18.
mysql> INSERT INTO menu (id, label, url) VALUES (4, 'Contact Us',
'contactus.html')
ON DUPLICATE KEY UPDATE label = 'Contact Us', url = 'contactus.html';
В этом случае MySQL определяет, что таблица уже содержит запись с тем же уникальным ключом, и автоматически модифицирует старую запись новыми значениями, которые определены в предложении ON DUPLICATE KEY UPDATE. В результате мы получим следующую таблицу.
Работа с полями, объявленными с модификатором default