Skip to content

Экспорт данных из базы данных MySQL с помощью SELECT…INTO OUTFILE

Пересказ статьи Robert Sheldon. Exporting data from a MySQL database using SELECT…INTO OUTFILE


В предыдущей статье этой серии я рассматривал оператор MySQL LOAD DATA, который позволяет получить данные из плоского текстового файла в таблицу. В этой статье я рассмотрю оператор SELECT…INTO OUTFILE, вид оператора SELECT, который включает предложение INTO OUTFILE. Это предложение позволяет экспортировать данные из одной или нескольких таблиц MySQL в плоский текстовый файл, что является обратной операцией по отношению к оператору LOAD DATA.
Построение оператора SELECT…INTO OUTFILE относительно простое. Основная часть оператора - это за незначительными исключениями обычный оператор SELECT (без предложение INTO OUTFILE). Само же предложение INTO OUTFILE конструируется довольно просто. Возможно, самой большой проблемой, с которой вы столкнетесь, будет отсутствие разрешений, необходимых для сохранения файла в целевой папке, что я буду обсуждать здесь. В остальном у вас не будет особых проблем, чтобы начать использовать предложение INTO OUTFILE.

Здесь я продемонстрирую ряд примеров, которые покажут, как работает это предложение, чтобы вы имели основное представление о том, как использовать его для экспорта данных. Большинство примеров построены на основе типичных операторов SELECT, чтобы вам легко было их проверить. Если у вас возникнут вопросы относительно самого оператора SELECT (а не о предложении INTO OUTFILE), обратитесь к более ранней статье, посвященной этому оператору.

Замечание. Примеры в этой статье выполнялись на локальном экземпляре MySQL, который содержал очень простую базу данных и таблицы. В приложении к данной статье приводится информация о том, как установить систему, и содержится скрипт SQL создания базы данных и таблиц для выполнения примеров.

Введение в оператор SELECT…INTO OUTFILE


Прежде чем перейти к примерам, следует разобраться с предложением INTO OUTFILE и с тем, где оно размещается в операторе SELECT. Следующий синтаксис показывает элементы, из которых состоит предложение:

SELECT statement_elements
INTO OUTFILE 'file_name'
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']];

statement_elements - это элементы, составляющие сам оператор SELECT, за исключением предложения INTO OUTFILE. По большей части, вы можете создать оператор SELECT любого типа. Главное, чтобы предложение INTO OUTFILE не было включено во вложенные подзапросы, поскольку они должны возвращать результаты во внешний запрос.

В документации также говорится и том, что MySQL устанавливает "ограничения на использование INTO в операторах UNION". К сожалению, в документации не говорится, какие это могут быть ограничения. Я выполнял оператор UNION, который включал предложение INTO OUTFILE в конце оператора, и файл создавался успешно. Однако при размещении предложения прямо перед первым предложением FROM я получал ошибку, сообщающую, что предложением INTO должно находиться в конце оператора UNION, так что, возможно, эти "ограничения" относятся, главным образом, к местоположению оператора.

В представленном синтаксисе предложение INTO OUTFILE размещается после всех остальных элементов оператора SELECT. Строго говоря, вы не обязаны размещать это предложение в конце оператора (за исключением оператора UNION или других теоретико-множественных операторов, как то INTERSECT и EXCEPT). Например, вы можете разместить это предложение перед предложением FROM или перед блокирующим предложением, таким как FOR UPDATE. Однако согласно документации MySQL предпочтительная позиция - конец оператора. Фактически, размещение предложения перед блокирующим предложением является устаревшим с MySQL 8.0.20, и если вы попробуете это сделать, то получите предупреждающее сообщение. Я рекомендую вам размещать это предложение в конце операторов SELECT, как советует документация.

Давайте теперь перейдем к самому предложению INTO OUTFILE. Это предложение начинается с имени целевого файла, который будет содержать результирующий набор, возвращенный оператором SELECT. В большинстве случаев это будет полное имя пути, которое указывает размещение файла на хосте MySQL. Если путь не включается, файл будет сохранен в папке, которая содержит данные базы данных.

При задании предложения INTO OUTFILE вы можете включить одну или несколько опций, которые определяются необязательными предложениями FIELDS и LINES. Эти два предложения синтаксически идентичны тем, которые используются в операторе LOAD DATA, и работают аналогично. Предложение FIELDS поддерживает одну или более из следующих трех опций:
  • Опция TERMINATED BY задает строку, используемую в текстовом файле для ограничения каждого поля. Эта строка может состоять из одного или нескольких символов. Значением по умолчанию является \t, т.е. поля разделяются табулятором.

  • Опция ENCLOSED BY задает символ, используемый в текстовом файле для ограничения всех или некоторых значений. Если вы включаете ключевое слово OPTIONALLY, то символ ENCLOSED BY применяется только к значениям строкового типа данных, таких как CHAR, BINARY, TEXT или ENUM. Значением по умолчанию для опции ENCLOSED BY является пустая строка, говорящая о том, поля ничем не ограничиваются.

  • Опция ESCAPED BY задает символ, используемый в текстовом файле для экранирования специальных символов. Значением по умолчанию является обратный слэш (\), который используется в MySQL для экранирования специальных символов, включая сам обратный слэш. Многие языки программирования также используют обратный слэш в аналогичных целях.

Само предложение FIELDS является необязательным. Если вы включите его, то должны будете указать хотя бы одну из этих трех опций. Предложение LINES тоже не является обязательным. Оно поддерживает либо одну, либо обе следующие опции:
  • Опция задает общий префикс, используемый в начале каждой строки в текстовом файле. Значением по умолчанию является пустая строка, т.е. префикс не используется.

  • Опция TERMINATED BY задает строку, используемую в текстовом файле для окончания каждой строки. Эта строка может состоять из одного или нескольких символов. Значением по умолчанию является \n, что означает символ новой строки (подача строки LF). Система, на которой вы работаете, может потребовать другую строку. Например, \n хорошо работает на компьютерах Mac, но вам может потребоваться \r\n на Windows.

Если вы включаете оба предложения FIELDS и LINES, то предложение FIELDS должно следовать первым. Я рекомендую вам обратиться к статье MySQL по оператору LOAD DATA, для получения более подробной информации о различных элементах, которые присутствуют в предложении INTO OUTFILE.

Вывод данных MySQL в файл


Теперь, когда мы имеем общее понимание синтаксиса INTO OUTFILE, давайте перейдем к примерам. Наиболее общий оператор SELECT…INTO OUTFILE включает только предложение SELECT и предложение INTO OUTFILE без каких-либо других опций импорта. Следующий оператор SELECT записывает четыре значения (два строковых и два целочисленных) в файл values01.txt:

SELECT 'abc', 123, 'def', 456
INTO OUTFILE 'values01.txt';

Оператор SELECT определяет четыре значения, а предложение INTO OUTFILE задает имя нового файла. Файл не должен существовать, когда вы выполняете этот оператор. В противном случае, вы получите ошибку. Если файл не существует, MySQL создаст файл и вставит значения, возвращаемые оператором SELECT. Следующее изображение показывает файл, открытый в BBEdit.



Замечание. В зависимости от используемой конфигурации вы можете получить такую ошибку при выполнении этого оператора:

INTO OUTFILE 'values01.txt'
Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
(Сервер MySQL запущен с опцией --secure-file-priv, поэтому он не может выполнить этот оператор)


Вы можете посмотреть установки безопасности с помощью

SHOW VARIABLES LIKE "secure_file_priv";

Это покажет вам путь, который был установлен для безопасного использования из сервера. Возможно, вам придется добавить префикс к именам файлов .txt из возвращаемого пути. Или вы можете изменить установки в конфигурационном файле на "", и ваш файл будет выведен в такое место, на которое сервер имеет права.

Когда вы используете предложение INTO OUTFILE, MySQL создает файл на компьютере, где выполняется MySQL. Не существует способа сохранить файл на другом компьютере, если к удаленному компьютеру нет доступа через сетевой путь в хост-системе.

В предыдущем примере вы могли обратить внимание, что имя файла указано без полного пути. Если вы не указываете путевое имя, MySQL создает файл в каталоге базы данных, которым в нашем случае является каталог travel, поскольку мы работаем с базой данных travel. В каталоге travel находятся файлы данных для таблиц airplanes и manufacturers. (Замечание: на машине с Windows файл размещался в C:\ProgramData\MySQL\MySQL Server 8.0\Data\travel).

Если вы используете экземпляр MySQL, которым не управляете, то можете столкнуться с ситуацией, когда администраторы не позволяют вам сохранять файлы в каталоге базы данных; в этом случае вам потребуется использовать другую папку. Для сохранения выходного файла где-нибудь еще вы должны указать полный путь к файлу в предложении INTO OUTFILE. Кроме того, целевой каталог должен быть сконфигурирован с надлежащими правами на запись. Если вы получаете ошибку “OS errno 13 – Permission denied”, когда пытаетесь выполнить ваш оператор, вы будете знать, что что-то не так с правами на каталог.

Другая проблема, с которой вы можете столкнуться, состоит в том, что аккаунт, который вы используете для входа на MySQL, должен иметь привилегию FILE, чтобы иметь возможность читать и записывать файлы на хосте MySQL. Без этой привилегии вы получите сообщение об ошибке запрета доступа при попытке выполнить ваш оператор. Если вы пытаетесь повторять примеры этой статьи, то, скорее всего, вы используете MySQL, хостом которого вы управляете, поэтому вы сами можете установить необходимые разрешения. Если вы не управляете хостом, вам нужно будет взаимодействовать с администратором базы данных или системным администратором, чтобы получить необходимые полномочия.

Имея это в виду, остальные примеры предполагают, что вы будете использовать размещение, отличное от каталога базы данных, при определении предложения INTO OUTFILE, и что вы имеете все необходимые разрешения для этого. Следующий пример подобен предыдущему, но теперь указывается полный путь к каталогу:

SELECT 'abc', 123, 'def', 456
INTO OUTFILE '/Users/user1/data/values02.txt';

Теперь предложение INTO OUTFILE указывает на каталог /Users/user1/data/ , а не папку базы данных. Однако вы можете указать любой каталог для работы. (Вы можете также использовать любое имя файла.) Если вы работаете в системе Windows, для указания пути вам следует использовать обратные слэши.

Большинство операторов SELECT содержат предложение FROM, которое возвращает данные из таблицы или другой табличной структуры, как то предложения VALUES или табличного подзапроса. Например, предложение FROM в следующем операторе SELECT содержит предложение VALUES, которое создает таблицу с двумя столбцами и тремя строками, которая выводится в файл values03.txt:

SELECT *
FROM (VALUES
ROW('abc', 123),
ROW('def', 456),
ROW('ghi', 789)) AS tbl
INTO OUTFILE '/Users/user1/data/values03.txt';

При выполнении этого оператора MySQL создает файл и заполняет его возвращаемыми значениями, как показано на следующем рисунке:



Конечно, вы можете также извлекать данные из обычной таблицы и выводить их в текстовый файл, при этом, скорее всего, вы будете использовать предложение INTO OUTFILE. Например, следующий оператор SELECT извлекает данные из таблицы airplanes и выводит результаты в файл airplanes01.txt:

SELECT * FROM airplanes
ORDER BY plane
LIMIT 10
INTO OUTFILE '/Users/user1/data/airplanes01.txt';

Оператор SELECT сортирует данные по столбцу plane и ограничивает результаты первыми десятью строками. Поскольку предложение SELECT включает только звездочку (*), оператор возвращает все столбцы таблицы и сохраняет их в файле airplanes01.txt, что показано на следующем рисунке.



Оператор MySQL TABLE также поддерживает предложение INTO OUTFILE. Поэтому вы можете переписать предыдущий оператор SELECT с использованием оператора TABLE, который возвращает те же результаты, но сохраняет их в файле airplanes02.txt:

TABLE airplanes
ORDER BY plane
LIMIT 10
INTO OUTFILE '/Users/user1/data/airplanes02.txt';

Оператор TABLE имеет довольно ограниченную область применения и поддерживает лишь несколько предложений, включая ORDER BY и LIMIT. Этот оператор может оказаться полезным, если вы хотите возвращать все столбцы и либо все строки, либо их определенное число. Тем не менее, обычно вы захотите иметь больший контроль над вашими запросами, и поэтому, вероятно, будете использовать оператор SELECT. Этот оператор позволит вам указывать возвращаемые столбцы и предоставит дополнительные предложения, такие как WHERE и GROUP BY. Например, следующий оператор SELECT ограничивает результаты конкретными столбцами и типами самолетов:

SELECT plane, engine_type, engine_count, max_weight, plane_length
FROM airplanes
WHERE engine_type = 'jet'
ORDER BY plane
INTO OUTFILE '/Users/user1/data/jets01.txt';

Теперь результаты более конкретны, что отражено в файле jets01.txt, который показан на следующем рисунке:



Как и ожидалось, файл содержит только те строки, у которых значение engine_type равно jet. Данные также ограничены пятью указанными столбцами plane, engine_type, engine_count, max_weight и plane_length.

Работа с опциями экспорта INTO OUTFILE


Как упоминалось ранее, предложение INTO OUTFILE поддерживает ряд опций импорта. Эти опции позволяют вам лучше управлять тем, как возвращаемые данные записываются в выходной файл. Если вы не укажите никаких опций экспорта, MySQL использует значения по умолчанию, такие как использование табулятора для разделения значений и отсутствие ограничения значений кавычками или другими символами.

Если бы предыдущий пример использовал опции экспорта с их значениями по умолчанию, он мог бы выглядеть следующим образом:

SELECT plane, engine_type, engine_count, max_weight, plane_length
FROM airplanes
WHERE engine_type = 'jet'
ORDER BY plane
INTO OUTFILE '/Users/user1/data/jets02.txt'
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY '';

Этот оператор возвращает те же результаты, что и предыдущий. Единственным отличием является то, что предложение INTO OUTFILE явно определяет опции экспорта, используя их значения по умолчанию. Однако предположим, что вы хотите использовать запятую вместо табулятора в качестве разделителя полей и заключать строковые значения в двойные кавычки. Для этого вы можете изменить опции экспорта таким образом:

SELECT plane, engine_type, engine_count, max_weight, plane_length
FROM airplanes
WHERE engine_type = 'jet'
ORDER BY plane
INTO OUTFILE '/Users/user1/data/jets03.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY '';

Опция FIELDS TERMINATED BY задает теперь запятую, а опция ENCLOSED BY - двойную кавычку. Предложение также включает ключевое слово OPTIONALLY, которое ограничивает применение к строковым значениям. Хотя оператор SELECT возвращает те же данные, что и предыдущий оператор, выходной файл теперь выглядит так, как показано на следующем рисунке.



Каждое строковое значение заключается в двойные кавычки, а поля раздедляются запятыми. Если вы хотите, можете использовать для этого файла расширение .csv, а не .txt. Результаты будут те же. Используйте то расширение файла, которое лучше отвечает вашим требованиям.

Теперь предположим, что вы хотите добавить префикс для каждой строки. Вы можете лугко сделать это, изменив значение опции STARTING BY. Например, следующий оператор SELECT заменяет пустую строку на xxx : (с концевым пробелом):

SELECT plane, engine_type, engine_count, max_weight, plane_length
FROM airplanes
WHERE engine_type = 'jet'
ORDER BY plane
INTO OUTFILE '/Users/user1/data/jets04.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY 'xxx : ';

Теперь каждая строка в файле начинается с указанного префикса, хотя результирующий набор остался тем же:



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

xxx : "747-8F","Jet",4,987000,250.17
xxx : "747-SP","Jet",4,696000,184.75
xxx : "757-300","Jet",2,270000,178.58
verify listing xxx : "767-200","Jet",2,315000,159.17
xxx : "767-200ER","Jet",2,395000,159.17
xxx : "A340-600","Jet",4,837756,247.24
xxx : "A350-800 XWB","Jet",2,546700,198.58

Приложение или процесс, который читает этот файл, такой как оператор MySQL LOAD DATA, может игнорировать все предшествующее префиксу, включая его самого, импортируя только фактические данные.

Мешанина


Пока примеры использовали значение по умолчанию для LINES TERMINATED BY (\n), которое означает, что каждая строка начиналась с новой строки, что позволяет легко различать строки. Однако иногда вы можете захотеть завершать каждую строку другим способом. Например, следующий оператор SELECT использует точку с запятой (;) в качестве значения LINES TERMINATED BY:

SELECT plane, engine_count, max_weight, wingspan, plane_length
FROM airplanes
WHERE engine_type = 'jet'
ORDER BY plane
INTO OUTFILE '/Users/user1/data/jets05.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY ';';

Поскольку точка с запятой используется для окончания каждой строки, данные сохраняются в файле как единственная строка. На следующем рисунке показан фрагмент результата из файла jets05.txt. Несмотря на то, что данные представлены единственной строкой, значения все же отличны друг от друга - запятые разделяют значения, а точка с запятой разделяет строки.



Операторы SELECT и TABLE поддерживают также предложение INTO DUMPFILE. Это предложение может использоваться вместо предложения INTO OUTFILE, но только если оператор SELECT возвращает единственную строку. Например, следующий оператор SELECT возвращает одну строку из таблицы airplanes, и сохраняет ее в файле jets06.txt:

SELECT plane, engine_count, max_weight, wingspan, plane_length
FROM airplanes
WHERE plane_id = 1001
INTO DUMPFILE '/Users/user1/data/jets06.txt';

Особенность предложения INTO DUMPFILE состоит в том, что он записывает данные без каких-либо разделителей полей или строк и без экранирования любых символов, составляя все значения вместе в единую строку, как показано на рисунке ниже. По этой причине данное предложение лучше всего подходит для извлечения отдельного значения BLOB и сохранения его в файле.



Предложение INTO OUTFILE значительно гибче, и вы можете использовать его в шировом диапазоне операторов SELECT. Например, следующий оператор SELECT соединяет таблицы manufacturers и airplanes, группирует данные на основе значений manufacturer_id, а затем агрегирует значения по нескольким столбцам:

SELECT a.manufacturer_id, m.manufacturer, 
COUNT(*) AS plane_count,
ROUND(AVG(a.wingspan), 2) AS avg_span,
ROUND(AVG(a.plane_length), 2) AS avg_length
FROM airplanes a INNER JOIN manufacturers m
ON a.manufacturer_id = m.manufacturer_id
GROUP BY a.manufacturer_id
ORDER BY m.manufacturer
INTO OUTFILE '/Users/user1/data/manufacturers01.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';

Предложение INTO OUTFILE сохраняет данные в файле manufacturers01.txt, как показано на следующем рисунке:



Хотя данные были сгруппированы и агрегированы, предложение INTO OUTFILE по-прежнему рассматривает результаты, как он это делал в предыдущих примерах: значения полей разделяются запятыми, а каждая строка начинается с новой, строковые значения заключаются в двойные кавычки. Как видите, вы можете также легко экспортировать результаты более сложных запросов, как это делалось для простых.

Начинаем экспортировать данные в MySQL


Предложение INTO OUTFILE дает вам исключительно полезный инструмент для экспорта данных. Поскольку он может включаться в ваши операторы SELECT и TABLE, вы можете легко экспортировать данные там, где вы обычно выполняете запросы SQL, т.е. вы можете также автоматизировать и выполнять операции экспорта по расписанию.

Однако следует иметь в виду, что имеются и другие способы экспорта данных. Одним из таких способов является выполнение команды mysql или mysqldump из командной строки и направлением результатов в файл. Вы можете также использовать встроенные в клиенте MySQL функции для экспорта данных. Например, MySQL Workbench позволяет вам экспортировать данные непосредственно из результатов поиска и сохранить их в JSON, CSV, XML, HTML или других форматах. Workbench также включает мастера Export and Import, который пошагово выполнит процесс экспорта данных.

Хотя для вас имеется множество вариантов экспорта данных в MySQL, предложение INTO OUTFILE может все же быть полезным. Вы можете легко встроить его в существующие операторы SELECT, делая возможным повторное использование (помните, что невозможно переписать существующий файл). Вы можете также настроить свои выходные файлы, чтобы позже использовать оператор LOAD DATA для импорта данных. Чем лучше вы поймете, как работает предложение INTO OUTFILE, тем больше выгоды вы сможете получить от этого простого, но эффективного инструмента.

Приложение: подготовка среды MySQL


При создании примеров для этой статьи я использовал компьютер Mac с установленным локально экземпляром MySQL 8.0.29 (Community Server edition). Я также использовал MySQL Workbench для работы с MySQL.

В примерах используются данные из базы данных travel, данные экспортируются в отдельные текстовые файлы на этом компьютере. База данных содержит таблицы manufacturers и airplanes, связанные внешним ключом. Это та же самая база данных, которую вы видели в предыдущих статьях этой серии. Если вы планируете выполнять эти примеры, начните с выполнения следующего скрипта на своем экземпляре MySQL:

DROP DATABASE IF EXISTS travel;
CREATE DATABASE travel;
USE travel;
CREATE TABLE manufacturers (
manufacturer_id INT UNSIGNED NOT NULL,
manufacturer VARCHAR(50) NOT NULL,
create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_update TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (manufacturer_id) );
CREATE TABLE airplanes (
plane_id INT UNSIGNED NOT NULL,
plane VARCHAR(50) NOT NULL,
manufacturer_id INT UNSIGNED NOT NULL,
engine_type VARCHAR(50) NOT NULL,
engine_count TINYINT NOT NULL,
max_weight MEDIUMINT UNSIGNED NOT NULL,
wingspan DECIMAL(5,2) NOT NULL,
plane_length DECIMAL(5,2) NOT NULL,
parking_area INT
GENERATED ALWAYS AS ((wingspan * plane_length)) STORED,
icao_code CHAR(4) NOT NULL,
create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_update TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (plane_id),
CONSTRAINT fk_manufacturer_id FOREIGN KEY (manufacturer_id)
REFERENCES manufacturers (manufacturer_id) );

Этот скрипт создаст базу данных travel и добавит таблицы manufacturers и airplanes в правильном порядке, определяемом внешним ключом в таблице airplanes. После создания таблиц вы можете выполнить следующие операторы INSERT:

INSERT INTO manufacturers (manufacturer_id, manufacturer)
VALUES (101,'Airbus'), (102,'Beagle Aircraft Limited'),
(103,'Beechcraft'), (104,'Boeing');
INSERT INTO airplanes
(plane_id, plane, manufacturer_id, engine_type, engine_count,
wingspan, plane_length, max_weight, icao_code)
VALUES
(1001,'A340-600',101,'Jet',4,208.17,247.24,837756,'A346'),
(1002,'A350-800 XWB',101,'Jet',2,212.42,198.58,546700,'A358'),
(1003,'A350-900',101,'Jet',2,212.42,219.16,617295,'A359'),
(1004,'A380-800',101,'Jet',4,261.65,238.62,1267658,'A388'),
(1005,'A380-843F',101,'Jet',4,261.65,238.62,1300000,'A38F'),
(1006,'A.109 Airedale',102,'Piston',1,36.33,26.33,2750,'AIRD'),
(1007,'A.61 Terrier',102,'Piston',1,36,23.25,2400,'AUS6'),
(1008,'B.121 Pup',102,'Piston',1,31,23.17,1600,'PUP'),
(1009,'B.206',102,'Piston',2,55,33.67,7500,'BASS'),
(1010,'D.5-108 Husky',102,'Piston',1,36,23.17,2400,'D5'),
(1011,'Baron 56 TC Turbo Baron',103,'Piston',2,37.83,28,5990,'BE56'),
(1012,'Baron 58 (and current G58)',103,'Piston',2,37.83,29.83,5500,'BE58'),
(1013,'Beechjet 400 (same as MU-300-10 Diamond II)',103,'Jet',2,43.5,48.42,15780,'BE40'),
(1014,'Bonanza 33 (F33A)',103,'Piston',1,33.5,26.67,3500,'BE33'),
(1015,'Bonanza 35 (G35)',103,'Piston',1,32.83,25.17,3125,'BE35'),
(1016,'747-8F',104,'Jet',4,224.42,250.17,987000,'B748'),
(1017,'747-SP',104,'Jet',4,195.67,184.75,696000,'B74S'),
(1018,'757-300',104,'Jet',2,124.83,178.58,270000,'B753'),
(1019,'767-200',104,'Jet',2,156.08,159.17,315000,'B762'),
(1020,'767-200ER',104,'Jet',2,156.08,159.17,395000,'B762');

Операторы INSERT заполнят данными таблицу manufacturers, а затем таблицу airplanes. Не нарушайте этот порядок из-за ограничения внешнего ключа.

Ссылки по теме
1. Оператор SELECT
2. Пересечение и разность множеств
3. Объединение множеств
4. Импорт данных в базу данных MySQL с помощью LOAD DATA
5. Резервирование в MySQL. Часть 1: mysqldump
Категории: MySQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.