PostgreSQL 创建表



在 PostgreSQL 中创建表

本节课程您将学习:

  • 使用 CREATE TABLE 语句创建表
  • 使用 CREATE TABLE AS 语句创建表
  • 创建临时表

使用 CREATE TABLE 语句创建表

表是关系数据库中存储结构化数据的基本结构, CREATE TABLE 语句用于在数据库中创建一个新表,以下是创建新表的语法。

语法:创建表
CREATE TABLE [IF NOT EXISTS] <table_name> (
   <column1> <data_type(length)> [column_contraint],
   <column2> <data_type(length)> [column_contraint],
...
   <columnN> <data_type(length)> [column_contraint],
   [table_constraints]
);

在上面的语法中,

  • CREATE TABLE 之后你可以指定可选 IF NOT EXISTS 的子句,只有当它不存在时才会创建一个表。如果表已经存在,Postgres 只会给出警告而不是错误并跳过创建新表。
  • table_name 是您要创建的表的唯一名称。
  • 在括号中,指定列名列表及其数据类型, data_type 是列将要存储的数据类型,例如字符串、整数、日期等。指定可选的 [comlumn_constraint] ,例如 NOT NULL、Check, Unique,、主键、外键等。
  • 指定可选的表级约束,例如 NULL、主键、外键、检查约束。

下面使用 psql 在 PostgreSQL 数据库中创建一个新表 person

示例:创建新表
CREATE TABLE IF NOT EXISTS person (
    Id 	INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    gender CHAR(1),
    birthdate DATE,
    email_id VARCHAR(100) UNIQUE,
    country_of_birth VARCHAR(50)
);

下面使用 psql 创建一个新表。

在 psql 中创建表
在psql中使用\d\dt命令列出当前数据库中的所有表。

在 psql 中列出表
使用\d table-name命令查看指定表的结构,它将列出表的所有列及其数据类型和约束。

在 psql 中列出表结构

CREATE TABLE AS

使用 CREATE TABLE AS 语句创建一个包含来自指定 SELECT 查询的数据的新表,表的列和数据类型将与 SELECT 查询的结果相同,它将从 SELECT 查询返回的记录添加到表中。

语法: CREATE TABLE AS
CREATE TABLE [IF NOT EXISTS] <table_name> 
[(<column1>, <column2>, ...)]
AS
<Query>;  

下面将创建EMPLOYEE表,它与从person表中 SELECT 查询结果具有相同列名和数据类型。

示例: CREATE TABLE AS
CREATE TABLE employee 
AS
SELECT * FROM person;

使用\dt\d employee命令可以看到新建的表和表结构,如下图。

在 psql 中列出表结构
如果你想创建一个带有选定列列表的表,你可以在 SELECT 子句中只选择所需的列。

示例: CREATE TABLE AS
CREATE TABLE employee 
AS SELECT ID, FIRST_NAME, LAST_NAME, GENDER FROM person;

如果您希望列名与 SELECT 查询列不同,您可以指定新的列列表。

示例: CREATE TABLE AS
CREATE TABLE employee(EmployeeId, FirstName, LastName, Gender) 
AS SELECT ID, FIRST_NAME, LAST_NAME, GENDER FROM person;

为避免表已存在时在建表时出现的错误,可以在建表时指定 IF NOT EXISTS 子句。

示例: CRATE TABLE AS
CREATE TABLE IF NOT EXISTS employee 
AS SELECT * FROM person;

创建临时表

Postgres 允许我们创建临时表,临时表仅在数据库会话期间存在,一旦我们与数据库会话断开连接,Postgres 就会删除所有临时表。

使用该 CREATE TEMPORARY TABLE 语句在当前数据库中创建一个新的临时表,您可以交替使用 TEMPORARYTEMP 关键字。

语法: CREATE TEMPORARY TABLE
CREATE TEMPORARY TABLE [IF NOT EXISTS] <table_name> (
   <column1> <data_type(length)> [column_contraint],
   <column2> <data_type(length)> [column_contraint],
...
   <columnN> <data_type(length)> [column_contraint],
   [table_constraints]
);

下面将创建一个临时表 myTempTble,请注意,我们使用了 IF NOT EXISTS 语句,因此如果表已经存在,那么 Postgres 只会给出警告并跳过表创建。

示例: 创建新的临时表
CREATE TEMPORARY TABLE IF NOT EXISTS myTempTble(
    Id 	INT,
    name VARCHAR(50)
);
  • Postgres 在单独的模式中创建临时表,因此在创建临时表时不能指定模式名称。
  • 在一个会话中创建的临时表仅限于该会话,同一数据库的另一个会话无法查看或访问前一个会话创建的临时表。
  • 临时表会在数据库会话结束时自动删除。
  • 临时表可以与数据库中的永久表同名,但不建议这样做,在这种情况下,无论何时您尝试访问该表,它总是引用临时表而不是永久表,永久表只有在删除临时表后才能访问。