Spec-Zone .ru
спецификации, руководства, описания, API

13.1.14.1. CREATE TABLE ...SELECT Синтаксис

Можно составить одну таблицу от другого, добавляя a 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=MyISAM SELECT b,c FROM test2;

Это создает a MyISAM таблица с тремя столбцами, 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: 0mysql> 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 часть.

Если какие-либо ошибки происходят, копируя данные в таблицу, они автоматически отбрасываются и не создаются.

Можно предшествовать SELECT IGNORE или REPLACE указать, как обработать строки тот двойной уникальный ключ значения. С IGNORE, отбрасываются новые строки, которые копируют существующую строку на значении уникального ключа. С REPLACE, новые строки заменяют строки, у которых есть то же самое значение уникального ключа. Если ни один IGNORE ни REPLACE определяется, двойной результат значений уникального ключа по ошибке.

Поскольку упорядочивание строк в базовом SELECT операторы не могут всегда определяться, CREATE TABLE ... IGNORE SELECT и CREATE TABLE ... REPLACE SELECT операторы отмечаются как опасные для основанной на операторе репликации. С этим изменением такие операторы производят предупреждение в журнале при использовании основанного на операторе режима и регистрируются, используя основанный на строке формат при использовании MIXED режим. См. также Раздел 16.1.2.1, "Преимущества и Недостатки Основанной на операторе и Построчной репликации".

CREATE TABLE ... SELECT автоматически не создает любой индексирует для Вас. Это делается преднамеренно, чтобы сделать оператор настолько гибким насколько возможно. Если Вы хотите иметь, индексирует в составленной таблице, следует определить их перед SELECT оператор:

mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM
        foo;

Некоторое преобразование типов данных могло бы произойти. Например, 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 .... Если Вы пытаетесь сделать так, сбои оператора.