PostgreSQL 教程: 复制表

九月 19, 2023

摘要:在本教程中,我们将逐步向您展示如何使用 PostgreSQL 中各种形式的复制表语句复制现有表,包括表结构和数据。

PostgreSQL Copy Table

PostgreSQL 复制表语句简介

要完全复制一个表,包括表结构和数据,请使用以下语句:

CREATE TABLE new_table AS 
TABLE existing_table;

要不带数据的复制表结构,请将WITH NO DATA子句添加到CREATE TABLE语句中,如下所示:

CREATE TABLE new_table AS 
TABLE existing_table 
WITH NO DATA;

要从现有表复制表,并包含部分的数据,请使用以下语句:

CREATE TABLE new_table AS 
SELECT
*
FROM
    existing_table
WHERE
    condition;

查询的WHERE子句中的条件,定义了现有表的哪些行将复制到新表。

请注意,上述所有语句都只复制表结构和数据,但不复制现有表的索引和约束。

PostgreSQL 复制表示例

以下语句创建一个新表,名为contacts,用于演示:

CREATE TABLE contacts(
    id SERIAL PRIMARY KEY,
    first_name VARCHAR NOT NULL,
    last_name VARCHAR NOT NULL,
    email VARCHAR NOT NULL UNIQUE
);

在此表中,我们有两个索引:一个索引用于主键,另一个索引用于UNIQUE约束。

让我们向contacts表中插入一些行:

INSERT INTO contacts(first_name, last_name, email) 
VALUES('John','Doe','john.doe@rockdata.net'),
      ('David','William','david.william@rockdata.net');

要将contacts复制到新表(例如contacts_backup表),请使用以下语句:

CREATE TABLE contact_backup 
AS TABLE contacts;

该语句创建一个名为contact_backup的新表,其结构与contacts表相同。此外,它将数据从contacts表复制到contact_backup表。

我们使用以下SELECT语句来检查contact_backup表的数据:

SELECT * FROM contact_backup;
id | first_name | last_name |                email
----+------------+-----------+------------------------------
  1 | John       | Doe       | john.doe@rockdata.net
  2 | David      | William   | david.william@rockdata.net
(2 rows)

它按预期返回两行。

要检查contact_backup表的结构:

test=# \d contact_backup;
       Table "public.contact_backup"
   Column   |       Type        | Modifiers
------------+-------------------+-----------
 id         | integer           |
 first_name | character varying |
 last_name  | character varying |
 email      | character varying |

正如您在输出中看到的,除了索引之外,contact_backup表的结构与contacts表相同。

要将主键和UNIQUE约束添加到contact_backup表中,请使用以下ALTER TABLE语句:

ALTER TABLE contact_backup ADD PRIMARY KEY(id);
ALTER TABLE contact_backup ADD UNIQUE(email);

要再次查看contact_backup表的结构,可以使用\d命令:

test=# \d contact_backup;
       Table "public.contact_backup"
   Column   |       Type        | Modifiers
------------+-------------------+-----------
 id         | integer           | not null
 first_name | character varying |
 last_name  | character varying |
 email      | character varying |
Indexes:
    "contact_backup_pkey" PRIMARY KEY, btree (id)
    "contact_backup_email_key" UNIQUE CONSTRAINT, btree (email)

在本教程中,您学习了如何使用 PostgreSQL 中各种形式的复制表语句将现有表复制到新表。