Skip to content

sql-clone-tables

在某些情况下,您需要创建表的副本,无论是为了备份、测试还是开发目的。SQL 提供了几种克隆表的方法,从仅复制结构到同时复制结构和数据。

方法 1:复制结构和数据 (CREATE TABLE AS)

Section titled “方法 1:复制结构和数据 (CREATE TABLE AS)”

CREATE TABLE ... AS SELECT 语句是根据 SELECT 查询结果集创建新表的一种快速且常用的方法。此方法复制源表的列定义、数据类型和所有数据。

重要提示: 此方法通常不复制原始表中的约束(如 PRIMARY KEY、FOREIGN KEY)或索引。您需要在之后手动添加这些。

CREATE TABLE new_table_name AS
SELECT * FROM original_table_name;

要创建 Customers 表的完整备份副本,命名为 Customers_Backup:

CREATE TABLE Customers_Backup AS
SELECT * FROM Customers;

执行此命令后,Customers_Backup 将存在,其列和所有数据与 Customers 相同,但它将缺少原始主键和其他约束。

有时您只需要一个具有相同结构的空表副本。

方法 A:LIKE 子句 (MySQL, PostgreSQL)

Section titled “方法 A:LIKE 子句 (MySQL, PostgreSQL)”

某些 RDBMS 在 CREATE TABLE 中提供了 LIKE 子句,可以复制完整的结构,包括列、数据类型,通常还有约束和索引。

-- 创建一个空表 'NewCustomers',其结构与 'Customers' 完全相同
CREATE TABLE NewCustomers (LIKE Customers INCLUDING ALL);

方法 B:CREATE TABLE AS ... WITH NO DATA (标准)

Section titled “方法 B:CREATE TABLE AS ... WITH NO DATA (标准)”

复制结构的标准方法是使用 CREATE TABLE AS,并带有一个始终为假的 WHERE 子句。这会根据 SELECT 语句的结构创建表,但不检索任何行进行插入。

CREATE TABLE NewCustomers AS
SELECT * FROM Customers WHERE 1 = 0; -- 这个条件永远不会为真

与第一种方法类似,此方法通常不复制约束或索引。

对于包括约束、索引和数据在内的真正完整克隆,通常需要多步操作:

  1. 1. 获取原始表的 DDL: 使用您的数据库客户端获取原始表的完整 CREATE TABLE 语句。在 MySQL 中,您可以使用 SHOW CREATE TABLE original_table;。在 PostgreSQL 中,您可以使用 pg_dump -s -t original_table。
  2. 2. 修改并运行 DDL: 获取步骤 1 的输出,将表名更改为新克隆的名称,并执行脚本。这将创建一个精确的结构副本,包括所有约束和索引。
  3. 3. 复制数据: 使用 INSERT INTO ... SELECT 语句从原始表填充新表的数据。
-- 步骤 2(概念性 - 假设您已从步骤 1 获取 DDL)
CREATE TABLE Customers_Clone (
-- ... 原始表的完整定义 ...
);
-- 步骤 3:复制数据
INSERT INTO Customers_Clone
SELECT * FROM Customers;