Одна из общих операций в MySQL, чтобы вставить запись в таблицу.
В этом руководстве объясняется, как использовать команду INSERT в MySQL и несколько практических и полезных примеров.
Рассматриваются в данном руководстве следующие примеры:
В следующем примере мы подключимся к базу данных andreyexbase с именем пользователя devuser и паролем mysecretpwd
# mysql -u devuser -pmysecretpwd andreyexbase mysql>
Для этого урока мы вставим значения в таблице сотрудников. Это структура таблицы сотрудников.
mysql> desc worker; +--------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | dept | varchar(10) | YES | | NULL | | | salary | int(10) | YES | | NULL | | +--------+-------------+------+-----+---------+----------------+
Если вы новичок в MySQL, используйте это Как создать MySQL базу данных и таблицу, чтобы начать работу.
Следующая команда вставит три новых записей в таблице сотрудников. В этом примере, после “values”, укажет значения для всех столбцов в таблице.
INSERT INTO worker VALUES(100,'Andrey','Sales',5000);
С помощью команды SELECT в MySQL, убедитесь, что записи был успешно установлены.
SELECT * FROM worker;
Если вы хотите, вставить значения только выбранных столбцов, следует указать имена столбцов в команде вставки.
Ниже будет вставлены две записи только для столбцов идентификатора и имени.
INSERT INTO worker(id,name) VALUES(200,'Maxim');
Для “отдела” и столбца “зарплаты”, мы не указали никаких значений для этой конкретной записи. Таким образом, мы будем видеть NULL в качестве значения в нашем выводе команды SELECT. Обратите внимание, что это не строка “NULL”, именно значение столбца в строке действительно нулевая.
mysql> SELECT * FROM worker; +-----+--------+-------+--------+ | id | name | dept | salary | +-----+--------+-------+--------+ | 100 | Andrey | Sales | 5000 | | 200 | Maxim | NULL | NULL | +-----+--------+-------+--------+ 2 rows in set (0.00 sec)
Вместо того чтобы использовать ключевого слова “values” в вашей команде выбора, вы можете также использовать ключевое слово “set” в вашей команде выбора, как показано ниже.
Следующая команда вставки точно так же, как и в предыдущем примере. Но, вместо значения, использует набор.
mysql> INSERT INTO worker SET id=300, name='Dimon';
mysql> select * from worker; +-----+--------+-------+--------+ | id | name | dept | salary | +-----+--------+-------+--------+ | 100 | Andrey | Sales | 5000 | | 200 | Maxim | NULL | NULL | | 300 | Dimon | NULL | NULL | +-----+--------+-------+--------+
В этом примере мы будем использовать INSERT … SELECT метод, который будет выбирать строки из другой таблицы, и вставлять его в нашу таблицу.
В следующем примере будет принимать все записи из таблицы подрядчика и вставить его в таблицу сотрудников.
INSERT INTO worker SELECT * FROM contractor;
Вы можете также использовать различные условия в “where” выберите команду, чтобы выбрать записи из таблицы подрядной и вставить в таблицу служащих, как показано ниже.
INSERT INTO worker SELECT * FROM contractor WHERE salary >= 7000;
Примечание: Если вы привыкли к базе данных Oracle, вы будете использовать “insert into worker AS select * from contractor”. Обратите внимание, что MySQL не использует ключевого слова “AS” в данном контексте.
Кроме того, можно выбрать только выбранные значения столбцов строк из другой таблицы и вставить его в таблицу.
В следующем примере будет принимать значения “ID” и “name” для всех строк в таблице подрядчика и вставлять его в таблицу сотрудников.
INSERT INTO worker(id,name) SELECT id,name FROM contractor;
Так же, как и в предыдущем примере, вы можете также использовать, когда есть условие и ограничение на записи.
INSERT INTO worker(id,name) SELECT id,name FROM contractor WHERE salary >= 7000;
Обратите внимание, что если запись уже существует для первичного ключа (что идентификатор) в таблице сотрудников, вы получите следующее сообщение об ошибке. Следующее сообщение об ошибке указывает на то, что идентификационный номер сотрудника “100” уже существует в таблице сотрудников.
ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY'
Если вы создали таблицу, используя раздел по диапазону, то вы можете указать раздел в вашей команде вставки, как показано ниже.
В следующем примере будет вставлять записи в таблицу служащих в разделе p1
INSERT INTO worker PARTITION (p1) VALUES(100,'Andrey','Sales',5000);
Обратите внимание, что строка уже существует в данном конкретном разделе. Например, в данном примере p1, вы получите следующее сообщение об ошибке:
ERROR 1729 (HY000): Found a row not matching the given partition set
Примечание: Эта функция будет работать только на MySQL 5.6 и выше.
Вы также можете вставлять записи на несколько разделов с помощью одного оператора вставки.
Следующий оператор вставки вставляет запись с идентификатором “100” в разделе p1, и запись с идентификатором “200” в разделе p2.
INSERT INTO worker PARTITION (p1, p2) VALUES(100,'Andrey','Sales',5000), (200,'Maxim','Technology',5500);
Обратите внимание, что в приведенном выше примере, если по каким-либо причинам MySQL не может вставить одну из записей в раздел, весь оператор вставки не получится, и обе записи не будут вставлены.
Опять же, это будет работать только на MySQL 5.6 и выше.
Если по какой-то причине вы хотите проигнорировать сообщение об ошибке MySQL во время вставки, вы можете использовать игнорирование вставки.
Например, следующая команда выдаст сообщение об ошибке, так как запись уже существует в таблице.
mysql> INSERT INTO worker VALUES(100,'Andrey','Sales',5000); ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY'
Чтобы проигнорировать выше сообщение об ошибке, вы можете использовать “insert ignore” (вместо того, чтобы просто вставить), как показано ниже. Обратите внимание, что это еще не вставит запись в таблицу, поскольку есть primary key в идентификаторе столбца. Но, это просто игнорирует сообщение об ошибке.
mysql> INSERT IGNORE INTO worker VALUES(100,'Andrey','Sales',5000); Query OK, 0 rows affected (0.00 sec)
Если MySQL работает в строгом режиме, и когда мы не указываем значения по умолчанию, он выдаст сообщение об ошибке.
Однако, если строгий режим не включен (который по умолчанию), и когда вы делаете команду вставки и не указываете значение столбца, он будет использовать значение по умолчанию для этого конкретного типа данных столбца.
Например, в бонусной таблице, оба значения столбца установлены в положение “not null”.
mysql> DESC bonus; +--------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | amount | int(11) | NO | | NULL | | +--------+---------+------+-----+---------+-------+
Давайте вставим запись в эту таблицу для столбца идентификаторов.
INSERT INTO bonus(id) VALUES(100);
Когда вы выполните команду select, вы заметите, что колонка “сумма” автоматически устанавливается неявной значением 0 по умолчанию.
SELECT * FROM bonus; +-----+--------+ | id | amount | +-----+--------+ | 100 | 0 | +-----+--------+
Если вы не указываете как для идентификатора и суммы, будет установлено на 0 автоматически, как показано ниже. Если значения не заданы, то MySQL будет использовать значения по умолчанию.
INSERT INTO bonus VALUES(); mysql> select * from bonus; +-----+--------+ | id | amount | +-----+--------+ | 0 | 0 | +-----+--------+
Примечание: Вы можете также использовать ключевое слово “DEFAULT” в значениях, как показано ниже, что позволит достичь выхода, как описано выше.
INSERT INTO bonus VALUES(DEFAULT,DEFAULT);
Для строки столбца, значение по умолчанию пустая строка. Кроме того, обратите внимание, что, когда числовой столбец имеет множество AUTO_INCREMENT, то значение по умолчанию будет следующее значение соответствующей последовательности.
В следующем примере для значения бонуса, мы определили “5000 + идентификатор” в качестве значения. Таким образом, это добавит значение идентификатор служащего к значению бонуса и вставит окончательное значение в колонке бонуса, как показано ниже.
Вы можете использовать “+”, “-“, “*”, или любой другой действующий оператор выражения MySQL в значениях. В следующем примере, он использует “50 * 2” для столбца идентификаторов. Таким образом, идентификатор, который будет вставлен в “100”
Вы можете также обратиться к значениям других столбцов. В следующем примере, он использует “5000 + id” для бонусного столбца. Таким образом, это будет иметь значение столбца идентификаторов (который является 100), и добавить его к 5000. Таким образом, окончательное значение бонуса “5100”, как показано ниже.
mysql> INSERT INTO worker VALUES(50*2,'Andrey','Sales',5000+id); mysql> select * from worker; +-----+--------+-------+--------+ | id | name | dept | salary | +-----+--------+-------+--------+ | 100 | Andrey | Sales | 5100 | +-----+--------+-------+--------+
Для движка, которая поддерживает блокировку таблицы (например, MyISAM), вы можете указать приоритет вашей вставки.
Например, команда Insert будет задерживать вставку (сделать его низкий приоритет) до тех пор, пока читают таблицы.
INSERT LOW_PRIORITY INTO worker VALUES(100,'Andrey','Sales',5000);
Можно также указать высокий приоритет, как показано ниже, который будет вести себя противоположно низким приоритетом вставки.
INSERT HIGH_PRIORITY INTO worker VALUES(100,'Andrey','Sales',5000);
Пожалуйста, имейте в виду, что если ваша база данных интенсивно считывается и если вы укажете LOW_PRIORITY в команде Insert, то ваша вставка может длится в течение очень долгого времени.
Кроме того, обратите внимание, что это немного отличается от “INSERT … DELAYED”, который является устаревшим, начиная с MySQL 5.6.6. Таким образом, не следует больше использовать “insert … delayed”.
Во время вставки, если есть дубликат ключа, она не будет выполнена, как показано ниже, в качестве идентификатора “100” уже существует в таблице.
mysql> INSERT INTO worker VALUES(100,'Andrey','Sales',5000); ERROR 1062 (23000): Duplicate entry '100' for key 'PRIMARY' mysql> select * from worker; +-----+--------+-------+--------+ | id | name | dept | salary | +-----+--------+-------+--------+ | 100 | Andrey | Sales | 5000 | +-----+--------+-------+--------+
Тем не менее, вы можете сделать некоторые обновления для этой конкретной записи (если дубликат обнаружен) с помощью “ON DUPLICATE KEY UPDATE”, как показано ниже.
Как показано в следующем примере, когда вставка не удалось (из-за дубликата ключа), мы обновляем столбец заработной платы путем добавления 500 к его стоимости.
mysql> INSERT INTO worker VALUES(100,'Andrey','Sales',5000) on DUPLICATE KEY UPDATE salary=salary+500; mysql> select * from worker; +-----+--------+-------+--------+ | id | name | dept | salary | +-----+--------+-------+--------+ | 100 | Andrey | Sales | 5500 | +-----+--------+-------+--------+
Обратите внимание, что в приведенном выше примере, при вставке, даже если обновляется только одна запись, то выход будет такой: “2 rows affected”.