Обновление: в подобных вопросах в SO таблица, в которую должны были быть скопированы данные, уже была создана в отличие от этого случая.
У меня есть таблица A с несколькими записями, и я хочу, чтобы ее данные были скопированы в другую несуществующую таблицу B. Поиск какого-либо запроса.
Мне не нравится использовать CREATE TABLE B AS SELECT * FROM A
потому что это не захватывает:
По крайней мере, он фиксирует параметры на уровне столбца, такие как NOT NULL и DEFAULT.
mysql> create table A ( i int primary key, x int default 123, unique key (x)) row_format=compressed;
mysql> create table b1 as select * from A;
mysql> show create table b1\G
*************************** 1. row ***************************
Table: b1
Create Table: CREATE TABLE 'b1' (
'i' int(11) NOT NULL,
'x' int(11) DEFAULT '123'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
Он получил параметры таблицы ENGINE и DEFAULT CHARSET только потому, что это глобальные значения по умолчанию. Если бы у меня был выбор по умолчанию для любого из этих параметров таблицы, они были бы потеряны в таблице клонов.
Попробуйте сделать это в два этапа, например:
CREATE TABLE B LIKE A;
INSERT INTO B SELECT * FROM A;
Таблица B будет иметь действительно идентичное определение с таблицей A, включая индексы, ограничения и параметры таблицы.
mysql> create table b2 like A;
mysql> show create table b2\G
*************************** 1. row ***************************
Table: b2
Create Table: CREATE TABLE 'b2' (
'i' int(11) NOT NULL,
'x' int(11) DEFAULT '123',
PRIMARY KEY ('i'),
UNIQUE KEY 'x' ('x')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED
Быстрый способ создать таблицу, а также скопировать в нее данные в одном запросе SQL.
CREATE TABLE B AS SELECT * FROM A;
Рабочий пример: