Navicat 博客

使用纯 SQL 将表复制到新表 2021 年 4 月 28 日,由 Robert Gravelle 撰写

很多时候,我们可能需要将数据从一个现有的表复制到一个新的表中,例如,备份数据,或将一个环境中的数据复制到另一个环境中,就像出于测试目的所做的那样。在 SQL 中,通常会使用 CREATE TABLE 和 SELECT 语句,如下所示:

CREATE TABLE new_table; 
SELECT SELECT col, col2, col3 
INTO new_table 
FROM
    existing_table;

在第一个语句中,数据库使用 CREATE TABLE 语句中指定的名创建一个新表。新表的结构由 SELECT 语句的结果集定义。然后,数据库将 SELECT 语句的结果填充到新表中。

尽管上述的过程可以完美地复制表,但是有一种更简单的方法,我们可以使用 CREATE TABLE 语句的变体将表复制到新表中!今天我们将在这里学习如何使用它。

介绍 CREATE TABLE AS SELECT 语句

CREATE TABLE 语句提供了一种方法从另一个表创建表。这种方法就是在 CREATE TABLE 语句的末尾添加 SELECT 语句。该语句的完整语法是这样:

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

这种方法只需一行代码,与我们在上面使用两个单独的语句所做的操作完全相同。

复制部分数据

由于 SELECT 语句支持你通常在 SQL 语句中使用的所有子句,包括 WHERE 和 ORDER BY 子句,因此我们可以通过在语句中提供条件来限制要复制的内容。以下是它的语法:

CREATE TABLE new_table 
SELECT col1, col2, col3 
FROM
    existing_table
WHERE
    conditions;

一些示例

以下是几个使用 Navicat Premium 作为数据库客户端的示例:

在最基本的形式中,CREATE TABLE AS SELECT 语句可以使用 SELECT All (*)按原样复制表。这是一个示例:

offices_bkp (82K)

这是一个更复杂的示例,该示例仅从 orders 表中复制三列,并将行限制为具有最近的 requiredDate 的行:

orders_copy (74K)

我们可以看到新表只有三列被选中:

orders_copy_data (55K)

总结

毫无疑问,CREATE TABLE AS SELECT 语句提供了一种快速简便的方法来将数据从一个表复制到新表中。话虽如此,它确实有其局限性。首先,并不是所有的关系数据库都支持它。我知道 MySQL 和 SQL Server 支持,但是其他数据库可能支持也可能不支持。

还值得注意的是,CREATE TABLE AS SELECT 语句只是复制表及其数据。它不会复制与表关联的其他数据库对象,例如索引、主键约束、外键约束、触发器等。为了不仅复制数据,并同时复制与表关联的所有数据库对象,我们应该使用两个单独的语句,如下所示:

CREATE TABLE orders_copy LIKE orders;

INSERT orders_copy
SELECT * FROM orders;

如果你对 Navicat Premium 感兴趣,可以免费试用 14 天!

Navicat 文章
频道条目
分享
文章归档