首页 > 解决方案 > MySQL:如何将表 A 的数据复制到新的不存在的表 B?

问题描述

更新: 在 SO 中的类似问题中,与这种情况不同,已经创建了要复制数据的表。

我的表A记录很少,并希望将其数据复制到另一个不存在的表B。寻找一些查询。

标签: mysqlsql

解决方案


我不喜欢使用CREATE TABLE B AS SELECT * FROM A,因为它不会捕获:

  • 索引
  • 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

推荐阅读