Использование механизма автоматического приращения при вставке данных
Механизм автоматического приращения предназначен для автоматического генерирования уникальных значений первичного
ключа в таблице. При его использовании не требуется проверять все значения первичного ключа, чтобы определить
максимальное значение. При создании новой записи можно указать в качестве значения первичного ключа
0 или NULL и в таблицу будет автоматически вставлено значение, увеличенное на единицу по сравнению с
максимальным значением.
В разных диалектах SQL синтаксис автоматического приращения различается. В MySQL используется
ключевое слово AUTO_INCREMENT. Таблица с использованием механизма AUTO_INCREMENT в MySQL создаётся так:
CREATE TABLE ADS (
Id INT(11) NOT NULL AUTO_INCREMENT,
Category varchar(25) DEFAULT ‘Some Category’,
Part varchar(25) DEFAULT ‘Some Part’,
Units INT(5) DEFAULT NULL,
Money INT(10) DEFAULT NULL,
PRIMARY KEY (Id)
)
В SQL Server используется ключевое слово IDENTITY (N, M), где N — начальное значение столца, M —
шаг приращения. Так, указав IDENTITY (1, 1) мы обеспечим начальное значение первичного ключа 1 и приращение
на 1 значения при каждой вставке новой строки:
CREATE TABLE ADS (
Id int IDENTITY(1, 1) PRIMARY KEY,
Category varchar(25) DEFAULT ‘Some Category’,
Part varchar(25) DEFAULT ‘Some Part’,
Units INT(5) DEFAULT NULL,
Money INT(10) DEFAULT NULL
)
Вставка значений по умолчанию (DEFAULT) и неопределённых значений (NULL)
Заметим, что при создании таблицы было предусмотрено, что значения столбцов могут иметь значения
по умолчанию (DEFAULT). На MySQL для столбца Id можно предусмотреть значение 100. На MS SQL Server
со строгим автоматическим приращением идентификатора это не допускается. В остальном же всё одинаково:
для стобцов Category и Part значения по умолчанию — соответственно
Some Category и Some Part, для столбцов Units и Money — значения NULL. Если в запросе на вставку данных
на MySQL некоторые столбцы отсутствуют, то в них будут вставлены значения по умолчанию. На MS SQL
в качестве значений нужно указать DEFAULT.
Пример 3. База данных и таблица — те же.
Запрос на MySQL. Вставим новые значения, указывая лишь столбец Id и его значение:
INSERT INTO ADS
(Id)
VALUES
(14)
Все столбцы кроме Id получили значения по умолчанию. После выполнения этого запроса
новая строка будет содержать следующие данные:
14 | Some Category | Some Part | NULL | NULL |
На MS SQL Server такой запрос недопустим.
Поскольку все столбцы могут иметь значения по умолчанию, можно использовать в запросе на вставку данных
ключевое слово DEFAULT и не указывать имена столбцов.
Пример 4. Запрос на MySQL. Вставим новые значения, используя ключевое слово DEFAULT и
не указывая имён столбцов:
INSERT INTO ADS
VALUES
(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)
Теперь все столбцы получили значения по умолчанию. После выполнения этого запроса
новая строка будет содержать следующие данные:
100 | Some Category | Some Part | NULL | NULL |
Запрос на MS SQL Server (без указания столбца Id):
USE adportal1;
INSERT INTO ADS
VALUES
(DEFAULT, DEFAULT, DEFAULT, DEFAULT)
Вместо многократного использования слова DEFAULT можно использовать конструкцию DEFAULT VALUES, которая
есть во многих диалектах SQL. Следует помнить, что в MySQL эта конструкция отсутствует.
Пример 5. Вставим новые значения, используя констукцию
DEFAULT VALUES (запрос можно использовать и на MS SQL Server c предваряющей конструкцией USE adportal1):
INSERT INTO ADS
DEFAULT VALUES
После выполнения этого запроса
новая строка будет содержать следующие данные:
след. номер | Some Category | Some Part | NULL | NULL |
Setting Up Our Database
In this code along, we’ll be creating a table in a . So, let’s navigate to our terminal and get started.
First let’s create our by running the following the command in the terminal:
Now that we have a database, let’s create our table along with , , and columns.
Okay, let’s start storing some cats.
Code Along I: INSERT INTO
In your terminal, in the sqlite prompt, type the following:
Hint: You can use double single quotes () to escape the apostrophe in .
We use the command, followed by the name of the table to which we want to add data. Then, in parentheses, we put the column names that we will be filling with data. This is followed by the keyword, which is accompanied by a parentheses enclosed list of the values that correspond to each column name.
Important: Note that we didn’t specify the «id» column name or value. Since we created the table with an «id» column whose type is , we don’t have to specify the id column values when we insert data. Primary Key columns are auto-incrementing. As long as you have defined an id column with a data type of , a newly inserted row’s id column will be automatically given the correct value.
Let’s add a few more cats to our table. This time we’ll do this via our text editor. Create a file, . Use two statements to insert the following cats into the table:
name | age | breed |
---|---|---|
«Lil’ Bub» | 5 | «American Shorthair» |
«Hannah» | 1 | «Tabby» |
Each statement gets its own line in the file in your text editor. Each line needs to end with a . Run the file with the following code in your terminal:
NOTE: This is a bash command, run this from your bash not sqlite console.
Now, we’ll learn how to data from a table, which will help us to confirm that we inserted the above data correctly.
SQL Учебник
SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии
Режим ведения журнала
Объем информации, записываемой в журнал для операции , зависит от модели восстановления, действующей для базы данных. В модели восстановления с неполным протоколированием и в простой модели массовые операции минимально протоколируются. При минимальном ведении журнала использование инструкции может оказаться более эффективным, чем создание таблицы и заполнение ее инструкцией INSERT. Дополнительные сведения см. в статье Журнал транзакций (SQL Server).
Инструкции , содержащие определяемые пользователем функции (UDF), являются полностью протоколируемыми операциями. Если определяемые пользователем функции, используемые в инструкции , не выполняют никакие операции доступа к данным, для таких функций можно указать предложение SCHEMABINDING, которое будет устанавливать для производного свойства UserDataAccess значение 0. После этого изменения инструкции будут протоколироваться на минимальном уровне. Если инструкция ссылается хотя бы на одну определяемую пользователем функцию, для которой это свойство имеет значение 1, операция полностью протоколируется.
Синтаксис
Запрос на добавление нескольких записей
INSERT INTO конечный_объект ])] SELECT поле1 FROM выражение_таблицы
Запрос на добавление одной записи
INSERT INTO конечный_объект ])] VALUES (значение1)
Инструкция INSERT INTO состоит из следующих элементов:
Часть |
Описание |
---|---|
конечный объект |
Имя таблицы или запроса, куда добавляются записи. |
поле1, поле2 |
После аргумента конечный_объект — имена полей, в которые добавляются данные; после аргумента источник — имена полей, из которых извлекаются данные. |
внешняя_база_данных |
Путь к внешней базе данных. Описание пути см. в статье, посвященной предложению IN. |
источник |
Имя таблицы или запроса, откуда копируются записи. |
выражение_таблицы |
Одно или несколько имен таблиц, из которых требуется получить записи. Этот аргумент может представлять собой имя отдельной таблицы, результирующее выражение, составленное с использованием операций INNER JOIN, LEFT JOIN или RIGHT JOIN, или сохраненный запрос. |
значение1, значение2 |
Значения, которые будут добавлены в определенные поля новой записи. Каждое значение вставляется в поле, соответствующее его положению в списке: значение1 добавляется в поле1 новой записи, значение2 — в поле2 и т. д. Необходимо разделять значения запятой и заключать текстовые поля в кавычки (‘ ‘). |
Инструкция SELECT INTO в Transact-SQL
SELECT INTO – инструкция в языке в T-SQL, которая создает новую таблицу и вставляет в нее результирующие строки из SQL запроса. Структура таблицы, т.е. количество и имена столбцов, а также типы данных и свойства допустимости значений NULL, будут на основе столбцов (выражений), указанных в списке выбора из источника в инструкции SELECT. Обычно инструкция SELECT INTO используется для объединения в одной таблице данных из нескольких таблиц, представлений, включая какие-то расчетные данные.
Для того чтобы использовать инструкцию SELECT INTO требуется разрешение CREATE TABLE в базе данных, в которой будет создана новая таблица.
Инструкция SELECT INTO имеет два аргумента:
- new_table — имя новой таблицы;
- filegroup – файловая группа. Если аргумент не указан, то используется файловая группа по умолчанию. Данная возможность доступна начиная с Microsoft SQL Server 2017.
Важные моменты про инструкцию SELECT INTO
- Инструкцию можно использовать для создания таблицы на текущем сервере, на удаленном сервере создание таблицы не поддерживается;
- Заполнить данными новую таблицу можно как с текущей базы данных и текущего сервера, так и с другой базы данных или с удаленного сервера. Например, указывать полное имя базы данных в виде база_данных.схема.имя_таблицы или в случае с удаленным сервером, связанный_сервер.база_данных.схема.имя_таблицы;
- Столбец идентификаторов в новой таблице не наследует свойство IDENTITY, если: инструкция содержит объединение (JOIN, UNION), предложение GROUP BY, агрегатную функцию, также, если столбец идентификаторов является частью выражения, получен из удаленного источника данных или встречается более чем один раз в списке выбора. Во всех подобных случаях столбец идентификаторов не наследует свойство IDENTITY и создается как NOT NULL;
- С помощью инструкции SELECT INTO нельзя создать секционированную таблицу, даже если исходная таблица является секционированной;
- В качестве новой таблицы можно указать обычную таблицу, а также временную таблицу, однако нельзя указать табличную переменную или возвращающий табличное значение параметр;
- Вычисляемый столбец, если такой есть в списке выбора инструкции SELECT INTO, в новой таблице он становится обычным, т.е. не вычисляемым;
- SELECT INTO нельзя использовать вместе с предложением COMPUTE;
- С помощью SELECT INTO в новую таблицу не переносятся индексы, ограничения и триггеры, их нужно создавать дополнительно, после выполнения инструкции, если они нужны;
- Предложение ORDER BY не гарантирует, что строки в новой таблице будут вставлены в указанном порядке.
- В новую таблицу не переносится атрибут FILESTREAM. Объекты BLOB FILESTREAM в новой таблице будут как объекты BLOB типа varbinary(max) и имеют ограничение в 2 ГБ;
- Объем данных, записываемый в журнал транзакций во время выполнения операций SELECT INTO, зависит от модели восстановления. В базах данных, в которых используется модель восстановления с неполным протоколированием, и простая модель, массовые операции, к которым относится SELECT INTO, минимально протоколируются. За счет этого инструкция SELECT INTO может оказаться более эффективней, чем отдельные инструкции по созданию таблицы и инструкции INSERT по заполнение ее данными.
Приоритет вставки INSERT LOW_PRIORITY / HIGH_PRIORITY
Установление приоритета нужно для решение проблем с конкурентными вставками. При вставках происходит блокировка строк и если 2 INSERT запроса требуют блокировки одних и тех же строк, для своего выполнения, то иногда может потребоваться повысить или понизить приоритет некоторых запросов, по отношению к другим. Это можно сделать указав приоритет LOW_PRIORITY или HIGH_PRIORITY
Наш запрос будет выглядеть так для LOW_PRIORITY:
INSERT LOW_PRIORITY INTO table1 (a, b, c) VALUES(1, 2, 3);
HIGH_PRIORITY:
INSERT HIGH_PRIORITY INTO table1 (a, b, c) VALUES(1, 2, 3);
Помогла ли Вам эта статья?
Да
Нет
Ответ 1
В последней версии MySQL синтаксис, представленный в вопросе, невозможен. Но есть несколько очень простых способов добиться того, что ожидается, используя существующие функции.
Есть 3 возможных решения: использовать INSERT IGNORE, REPLACE или INSERT… ON DUPLICATE KEY UPDATE.
Итак, у нас есть таблица:
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
Теперь представьте, что у нас есть автоматический конвейер, импортирующий метаданные транскриптов из Ensembl, и что по разным причинам конвейер может сломаться на любом этапе выполнения. Таким образом, нам нужно обеспечить две вещи:
-
повторные запуски конвейера не уничтожат нашу базу данных;
-
повторное выполнение не прекратится из-за ошибок «дублирования первичного ключа».
Метод 1: использование REPLACE
Все очень просто:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = ‘ENSORGT00000000001’,
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Если запись существует, она будет перезаписана; если ее еще нет, она будет создана. Однако в нашем случае использование этого метода неэффективно: нам не нужно перезаписывать существующие записи, их можно просто пропустить.
Метод 2: использование INSERT IGNORE:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = ‘ENSORGT00000000001’,
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
Здесь, если ensembl_transcript_id уже присутствует в базе данных, он будет автоматически пропущен (проигнорирован). (Чтобы быть более точным, вот цитата из справочного руководства MySQL: «Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT, вместо этого обрабатываются как предупреждения. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY, в таблице вызывает ошибку дублирования ключа, и оператор прерывается».) Если запись еще не существует, она будет создана.
Этот второй метод имеет несколько потенциальных недостатков, включая невозможность прерывания запроса в случае возникновения какой-либо другой проблемы. Таким образом, его следует использовать, если ранее не было ключевого слова IGNORE.
Метод 3: использование INSERT… ON DUPLICATE KEY UPDATE:
Третий вариант — использовать INSERT … ON DUPLICATE KEY UPDATE синтаксис, где в части UPDATE просто ничего не делается, выполняется какая-то бессмысленная (пустая) операция, например, вычисляется 0 + 0 (или просто выполняется присвоение id = id для механизма оптимизации MySQL, чтобы игнорировать эту операцию). Преимущество этого метода в том, что он игнорирует только повторяющиеся ключевые события и по-прежнему прерывает выполнение других ошибок.
Типы данных
Атрибут FILESTREAM не переносится в новую таблицу. Объекты BLOB FILESTREAM копируются и хранятся в новой таблице как объекты BLOB типа varbinary(max) . Без атрибута FILESTREAM тип данных varbinary(max) имеет ограничение в 2 ГБ. Если размер большого двоичного объекта FILESTREAM превышает это значение, происходит ошибка 7119 и инструкция прекращает работу.
При выборе существующего столбца идентификаторов в новой таблице новый столбец наследует свойство IDENTITY, если не выполняется ни одно из следующих условий.
-
Инструкция SELECT содержит соединение.
-
несколько инструкций SELECT соединены при помощи UNION;
-
столбец идентификаторов встречается более чем один раз в списке выбора;
-
столбец идентификаторов является частью выражения;
-
столбец идентификаторов получен из удаленного источника данных.
Если любое из этих условий выполняется, столбец создается как NOT NULL и не наследует свойство IDENTITY. Если в новой таблице необходим столбец идентификаторов, но такой столбец недоступен или необходимо изменить начальное значение или шаг приращения по сравнению с исходным столбцом идентификаторов, определите столбец в списке выбора с помощью функции IDENTITY. См. подраздел «Создание столбца идентификаторов с помощью функции IDENTITY» далее в разделе «Примеры».
SQL INSERT INTO
Инструкция INSERT INTO используется для вставки новых записей в таблицу.
Синтаксис INSERT INTO
Написать инструкцию INSERT INTO можно двумя способами.
Первый способ определяет как имена столбцов, так и значения, которые будут вставлены:
INSERT INTO table_name (column1, column2, column3, …)
VALUES (value1, value2, value3, …);
Если вы добавляете значения для всех столбцов таблицы, вам не нужно указывать имена столбцов в SQL запросе.
Однако убедитесь, что порядок значений находится в том же порядке, что и столбцы в таблице.
Синтаксис INSERT INTO будет выглядеть следующим образом:
INSERT INTO table_name
VALUES (value1, value2, value3, …);
Добавление части строк
В предыдущем примере при использовании оператора INSERT мы явно отмечали имена столбцов таблицы. Используя данный синтаксис, мы можем пропустить некоторые столбцы. Это значит, что вы вводите значение для одних столбцов но не предлагаете их для других. Например:
INSERT INTO Sellers (ID, City, Seller_name) VALUES (‘6’, ‘Los Angeles’, ‘Harry Monroe’)
В данном примере мы не указали значение для двух столбцов Address и Country . Вы можете исключать некоторые столбцы из оператора INSERT INTO, если это позволяет производить определение таблицы. В этом случае должно соблюдаться одно из условий: этот столбец определен как допускающий значение NULL (отсутствие какого-либо значения) или в определение таблицы указанное значение по умолчанию. Это означает, что, если не указано никакое значение, будет использовано значение по умолчанию. Если вы пропускаете столбец таблицы, которая не допускает появления в своих строках значений NULL и не имеет значения, определенного для использования по умолчанию, СУБД выдаст сообщение об ошибке, и это строка не будет добавлена.
INSERT INTO
Добавляет данные в таблицу.
Синтаксис
Вы можете указать список столбцов для вставки, используя синтаксис . Также можно использовать выражение cо и/или модификаторами, такими как , , .
В качестве примера рассмотрим таблицу:
Если вы хотите вставить данные во все столбцы, кроме ‘b’, вам нужно передать столько значений, сколько столбцов вы указали в скобках:
В этом примере мы видим, что вторая строка содержит столбцы и , заполненные переданными значениями и , заполненный значением по умолчанию.
Если список столбцов не включает все существующие столбцы, то все остальные столбцы заполняются следующим образом:
- Значения, вычисляемые из выражений, указанных в определении таблицы.
- Нули и пустые строки, если не определены.
В INSERT можно передавать данные любого , который поддерживает ClickHouse. Для этого формат необходимо указать в запросе в явном виде:
Например, следующий формат запроса идентичен базовому варианту INSERT … VALUES:
ClickHouse отсекает все пробелы и один перенос строки (если он есть) перед данными
Рекомендуем при формировании запроса переносить данные на новую строку после операторов запроса (это важно, если данные начинаются с пробелов)
Пример:
С помощью консольного клиента или HTTP интерфейса можно вставлять данные отдельно от запроса. Как это сделать, читайте в разделе «».
Ограничения (constraints)
Если в таблице объявлены , то их выполнимость будет проверена для каждой вставляемой строки. Если для хотя бы одной строки ограничения не будут выполнены, запрос будет остановлен.
Вставка результатов
Синтаксис
Соответствие столбцов определяется их позицией в секции SELECT. При этом, их имена в выражении SELECT и в таблице для INSERT, могут отличаться. При необходимости выполняется приведение типов данных, эквивалентное соответствующему оператору CAST.
Все форматы данных кроме Values не позволяют использовать в качестве значений выражения, такие как , и подобные. Формат Values позволяет ограниченно использовать выражения, но это не рекомендуется, так как в этом случае для их выполнения используется неэффективный вариант кода.
Не поддерживаются другие запросы на модификацию части данных: , , , , , .
Вы можете удалять старые данные с помощью запроса .
Для табличной функции input() после секции должна следовать
секция .
Чтобы вставить значение по умолчанию вместо в столбец, который не позволяет хранить , включите настройку .
Вставка данных из файла
Синтаксис
Используйте этот синтаксис, чтобы вставить данные из файла, который хранится на стороне клиента. и задаются в виде строковых литералов. Формат входного файла должен быть задан в секции .
Поддерживаются сжатые файлы. Формат сжатия определяется по расширению файла, либо он может быть задан в секции . Поддерживаются форматы: , , , , , , , .
Эта функциональность поддерживается клиентом командной строки и clickhouse-local.
Пример
Выполните следующие запросы, используя клиент командной строки:
Результат:
Вставка в табличную функцию
Данные могут быть вставлены в таблицы, заданные с помощью табличных функций.
Синтаксис
Пример
Табличная функция используется в следующих запросах:
Результат:
Замечания о производительности
сортирует входящие данные по первичному ключу и разбивает их на партиции по ключу партиционирования. Если вы вставляете данные в несколько партиций одновременно, то это может значительно снизить производительность запроса . Чтобы избежать этого:
- Добавляйте данные достаточно большими пачками. Например, по 100 000 строк.
- Группируйте данные по ключу партиционирования самостоятельно перед загрузкой в ClickHouse.
Снижения производительности не будет, если:
- Данные поступают в режиме реального времени.
- Вы загружаете данные, которые как правило отсортированы по времени.
Также возможно вставлять данные асинхронно во множественных маленьких вставках. Данные от таких вставок сначала собираются в пачки, а потом вставляются в таблицу. Чтобы включить асинхронный режим, используйте настройку
Обратите внимание, что асинхронные вставки поддерживаются только через протокол HTTP, а дедупликация при этом не производится
См. также
Аргументы
new_table
Указывает имя новой таблицы, создаваемой на основе столбцов, указанных в списке выбора, и строк, выбираемых из источника данных.
Формат аргумента new_table определяется путем расчета выражений, указанных в списке выбора. Столбцы в таблице, указанной в аргументе new_table, создаются в порядке, соответствующем списку выбора. Все столбцы таблицы, указанной в аргументе new_table, получают такие же имена, значения, типы данных и свойства допустимости значений NULL, которые указаны в соответствующем выражении в списке выбора. Свойство IDENTITY столбца переносится за исключением случаев, когда наступают условия, описанные в подразделе «Примечания» раздела «Работа со столбцами идентификаторов».
Для того чтобы создать таблицу в другой базе данных в этом же экземпляре службы SQL Server, определите new_table в качестве полного имени в форме database.schema.table_name.
new_table нельзя создать на удаленном сервере, однако new_table можно заполнить из удаленного источника данных. Для создания таблицы new_table из удаленного источника таблицы определите источник таблицы, используя четырехчастное имя в форме linked_server.catalog.schema.object в предложении FROM инструкции SELECT. Для указания удаленного источника данных также можно использовать функцию OPENQUERY или функцию OPENDATASOURCE в предложении FROM.
filegroup
Указывает имя файловой группы, в которой будет создана таблица. Указанная файловая группа должна существовать в базе данных, в противном случае обработчик SQL Server создает ошибку.
Применимо к: SQL Server 2016 (13.x); с пакетом обновления 2 (SP2) и выше.
Ответ 2
Решение:
INSERT INTO `table` (`value1`, `value2`)
SELECT ‘stuff for value1’, ‘stuff for value2’ FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `table`
WHERE `value1`=’stuff for value1′ AND `value2`=’stuff for value2′ LIMIT 1)
Объяснение:
SELECT * FROM `table`
WHERE `value1`=’stuff for value1′ AND `value2`=’stuff for value2′ LIMIT 1
Используемое в качестве WHERE NOT EXISTS-условие определяет, существует ли уже строка с данными для вставки. После того как будет найдена одна такая строка, запрос может остановиться, поэтому LIMIT 1 (микрооптимизация может быть опущена).
Промежуточный запрос:
SELECT ‘stuff for value1’, ‘stuff for value2’ FROM DUAL
представляет значения, которые нужно вставить. DUAL относится к специальной таблице с одной строкой и одним столбцом, которая по умолчанию присутствует во всех базах данных Oracle. На MySQL-сервере версии 5.7.26 я получил действительный запрос при пропуске FROM DUAL, но более старые версии (например, 5.5.60), похоже, требуют секции FROM. При использовании WHERE NOT EXISTS промежуточного запроса возвращается пустой набор результатов, если самый внутренний запрос нашел совпадающие данные.
Внешний запрос:
INSERT INTO `table` (`value1`, `value2`)
вставляет данные, если они были возвращены промежуточным запросом.
Демо база данных
В этом уроке мы будем использовать хорошо известный пример базы данных Northwind.
Ниже приведен выбор из таблицы «Customers»:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
И выбор из таблицы «Suppliers»:
SupplierID | SupplierName | ContactName | Address | City | Postal Code | Country |
---|---|---|---|---|---|---|
1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | Londona | EC1 4SD | UK |
2 | New Orleans Cajun Delights | Shelley Burke | P.O. Box 78934 | New Orleans | 70117 | USA |
3 | Grandma Kelly’s Homestead | Regina Murphy | 707 Oxford Rd. | Ann Arbor | 48104 | USA |
Insert Data Only in Specified Columns
It is also possible to only insert data in specific columns.
The following SQL statement will insert a new record, but only insert data in the «CustomerName»,
«City», and «Country» columns (CustomerID will
be updated automatically):
Example
INSERT INTO Customers (CustomerName, City, Country)
VALUES (‘Cardinal’, ‘Stavanger’, ‘Norway’);
The selection from the «Customers» table will now look like this:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
89 | White Clover Markets | Karl Jablonski | 305 — 14th Ave. S. Suite 3B | Seattle | 98128 | USA |
90 | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
91 | Wolski | Zbyszek | ul. Filtrowa 68 | Walla | 01-012 | Poland |
92 | Cardinal | null | null | Stavanger | null | Norway |
❮ Previous
Next ❯