Spec-Zone .ru
спецификации, руководства, описания, API
|
Можно составить одну таблицу от другого, добавляя a SELECT
оператор в конце CREATE TABLE
оператор:
CREATE TABLEnew_tbl
[AS] SELECT * FROMorig_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
...