首頁 > 軟體

PostgreSQL 複製表的 5 種方式詳解

2023-01-20 14:02:51

PostgreSQL 提供了多種不同的複製表的方法,它們的差異在於是否需要複製表結構或者資料。

CREATE TABLE AS SELECT 語句

CREATE TABLE AS SELECT 語句可以用於複製表結構和資料,但是不會複製索引。

我們可以使用以下語句基於 employee 複製一個新表 emp2,包括表中的資料:

CREATE TABLE emp2 
AS
SELECT * FROM employee;

如果只想要複製表結構,不復制資料,可以增加 WITH NO DATA 子句:

CREATE TABLE emp2 
AS
SELECT * FROM employee
WITH NO DATA;

或者也可以使用一個不返回任何結果的查詢語句,例如:

CREATE TABLE emp2 
AS
SELECT * FROM employee
WHERE FALSE;

這種複製方法不會建立任何索引或者約束,例如主鍵、外來鍵以及 NOT NULL 約束等。

CREATE TABLE LIKE 語句

CREATE TABLE LIKE 語句也可以用於複製表結構:

CREATE TABLE emp3 
(LIKE employee);

語法中的括號是必不可少的,而且這種方法不會複製資料,但是會複製欄位的 NOT NULL 約束。

CREATE TABLE AS TABLE 語句

CREATE TABLE AS TABLE 語句可以複製表結構和資料,例如:

CREATE TABLE emp4 
AS 
TABLE employee
WITH NO DATA;

這種語法不會複製索引、外來鍵以及非空約束等。

如果不需要複製資料,可以使用 WITH NO DATA 子句:

CREATE TABLE emp4 
AS 
TABLE employee
WITH NO DATA;

SELECT INTO 語句

SELECT INTO 語句可以複製表結構和資料,但是不包含索引等。例如:

SELECT * INTO emp5 FROM employee;

PostgreSQL 推薦使用 CREATE TABLE AS 替代 SELECT INTO 語句實現類似效果,因為前者適用性更廣,功能更全。

CREATE TABLE INHERITS 語句

PostgreSQL 支援 CREATE TABLE 語句的 INHERIT 子句,用於繼承表結構。這種複製表的方法和其他方法有所區別,任何針對父表的修改通常也會自動修改子表。

另外,這種方法還可以為子表定義額外的欄位。例如:

CREATE TABLE emp5 (
    notes text NOT NULL
) 
INHERITS ( employee );

其中,notes 是我們額外定義的欄位,其他欄位繼承 employee。

使用 psql d 命令檢視 emp5 的結構如下:

d emp5

                        Table "public.emp5"
  Column   |          Type          | Collation | Nullable | Default
-----------+------------------------+-----------+----------+---------
 emp_id    | integer                |           | not null |
 emp_name  | character varying(50)  |           | not null |
 sex       | character varying(10)  |           | not null |
 dept_id   | integer                |           | not null |
 manager   | integer                |           |          |
 hire_date | date                   |           | not null |
 job_id    | integer                |           | not null |
 salary    | numeric(8,2)           |           | not null |
 bonus     | numeric(8,2)           |           |          |
 email     | character varying(100) |           | not null |
 notes     | text                   |           | not null |
Check constraints:
    "ck_emp_salary" CHECK (salary > 0::numeric)
    "ck_emp_sex" CHECK (sex::text = ANY (ARRAY['男'::character varying, '女'::character varying]::text[]))
Inherits: employee

到此這篇關於PostgreSQL 複製表的 5 種方式的文章就介紹到這了,更多相關PostgreSQL 複製表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com