sql-clone-tables
SQL - 克隆表
Section titled “SQL - 克隆表”在某些情况下,您需要创建表的副本,无论是为了备份、测试还是开发目的。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 ASSELECT * FROM original_table_name;要创建 Customers 表的完整备份副本,命名为 Customers_Backup:
CREATE TABLE Customers_Backup ASSELECT * FROM Customers;执行此命令后,Customers_Backup 将存在,其列和所有数据与 Customers 相同,但它将缺少原始主键和其他约束。
方法 2:仅复制结构
Section titled “方法 2:仅复制结构”有时您只需要一个具有相同结构的空表副本。
方法 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 ASSELECT * FROM Customers WHERE 1 = 0; -- 这个条件永远不会为真与第一种方法类似,此方法通常不复制约束或索引。
完整的克隆过程
Section titled “完整的克隆过程”对于包括约束、索引和数据在内的真正完整克隆,通常需要多步操作:
- 1. 获取原始表的 DDL: 使用您的数据库客户端获取原始表的完整
CREATE TABLE语句。在 MySQL 中,您可以使用SHOW CREATE TABLE original_table;。在 PostgreSQL 中,您可以使用pg_dump -s -t original_table。 - 2. 修改并运行 DDL: 获取步骤 1 的输出,将表名更改为新克隆的名称,并执行脚本。这将创建一个精确的结构副本,包括所有约束和索引。
- 3. 复制数据: 使用
INSERT INTO ... SELECT语句从原始表填充新表的数据。
-- 步骤 2(概念性 - 假设您已从步骤 1 获取 DDL)CREATE TABLE Customers_Clone ( -- ... 原始表的完整定义 ...);
-- 步骤 3:复制数据INSERT INTO Customers_CloneSELECT * FROM Customers;