13.1.18.4 Заявление CREATE TABLE ... SELECT
Вы можете создать одну таблицу из другой, добавив оператор SELECT в конце оператора CREATE TABLE:
CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;
MySQL создает новые столбцы для всех элементов в SELECT. Например:
mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY (a), KEY(b))
-> ENGINE=InnoDB SELECT b,c FROM test2;
Это создает таблицу InnoDB с тремя столбцами, a, b и c. Опция ENGINE является частью оператора CREATE TABLE и не должна использоваться после оператора SELECT; это приведет к синтаксической ошибке. То же самое относится к другим опциям оператора CREATE TABLE, таким как CHARSET.
Обратите внимание, что столбцы из оператора SELECT добавляются в правую часть таблицы, а не перекрывают её. Рассмотрим следующий пример:
mysql> SELECT * FROM foo;
+---+
| n |
+---+
| 1 |
+---+
mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM bar;
+------+---+
| m | n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)
Для каждой строки в таблице foo вставляется строка в bar со значениями из foo и значениями по умолчанию для новых столбцов.
В таблице, полученной с помощью CREATE TABLE ...
SELECT, столбцы, именованные только в части CREATE TABLE, стоят первыми. Столбцы, именованные в обеих частях или только в части SELECT, следуют за ними. Тип данных столбцов из SELECT могут быть переопределены, если столбец также указан в части CREATE TABLE.
Если при копировании данных в таблицу возникнут ошибки, таблица автоматически удаляется и не создается.
Вы можете использовать IGNORE или REPLACE перед SELECT, чтобы указать, как обрабатывать строки, которые дублируют значения уникальных ключей. С помощью IGNORE строки, дублирующие существующую строку по значению уникального ключа, отбрасываются. С помощью REPLACE новые строки заменяют строки с одинаковым значением уникального ключа. Если ни IGNORE, ни REPLACE не указаны, дублирующие значения уникального ключа приведут к ошибке. Дополнительную информацию см. в Влиянии IGNORE на выполнение оператора.
Поскольку порядок строк в базовых операторах SELECT не всегда может быть определен, операторы CREATE TABLE ... IGNORE SELECT и CREATE TABLE ... REPLACE SELECT помечаются как небезопасные для репликации на основе операторов. Такие операторы генерируют предупреждение в журнале ошибок при использовании режима репликации на основе операторов и записываются в двоичный журнал в формате на основе строк при использовании режима MIXED. См. также Раздел 16.2.1.1, «Преимущества и недостатки репликации на основе операторов и на основе строк».
CREATE TABLE ...
SELECT не создает автоматически никаких индексов. Это сделано намеренно, чтобы оператор был максимально гибким. Если вы хотите иметь индексы в созданной таблице, укажите их до оператора SELECT:
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Для CREATE TABLE ... SELECT целевая таблица не сохраняет информацию о том, являются ли столбцы из выбираемой таблицы сгенерированными столбцами. Часть оператора SELECT не может назначать значения сгенерированным столбцам в целевой таблице.
Может произойти некоторое преобразование типов данных. Например, атрибут AUTO_INCREMENT не сохраняется, а столбцы типа VARCHAR могут стать столбцами типа CHAR. Сохраняемые атрибуты — это NULL (или NOT
NULL) и, для тех столбцов, где они есть, CHARACTER SET, COLLATION, COMMENT и условие DEFAULT.
При создании таблицы с помощью CREATE
TABLE ... SELECT, убедитесь, что все вызовы функций или выражения в запросе имеют псевдонимы. В противном случае оператор CREATE может завершиться ошибкой или привести к нежелательным именам столбцов.
CREATE TABLE artists_and_works
SELECT artist.name, COUNT(work.artist_id) AS number_of_works
FROM artist LEFT JOIN work ON artist.id = work.artist_id
GROUP BY artist.id;
Также можно явно указать тип данных для столбца в создаваемой таблице:
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
Для CREATE TABLE
... SELECT, если IF NOT EXISTS задано и целевая таблица существует, ничего не вставляется в целевую таблицу, и оператор не регистрируется.
Чтобы обеспечить возможность использования двоичного журнала для повторного создания исходных таблиц, MySQL не допускает одновременных вставок во время CREATE TABLE ...
SELECT.
Вы не можете использовать FOR UPDATE в качестве части SELECT в операторе, таком как CREATE
TABLE . Если вы попытаетесь это сделать, оператор завершится ошибкой.new_table SELECT ... FROM
old_table ...
© 2025 Oracle
Licensed under the GPLv2 License.