Мне не нравится использовать CREATE TABLE B AS SELECT * FROM A
, потому что это не будет захватывать:
- indexes
- ограничения, такие как PRIMARY KEY, UNIQUE KEY или FOREIGN KEY
- опций таблицы, таких как ROW_FORMAT
По крайней мере, она захватывает опции уровня столбца, такие как 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