📜  PostgreSQL – 创建表

📅  最后修改于: 2022-05-13 01:57:15.677000             🧑  作者: Mango

PostgreSQL – 创建表

在 PostgreSQL 中,顾名思义,CREATE TABLE 子句用于创建新表。

Syntax:
CREATE TABLE table_name (
    column_name TYPE column_constraint,
    table_constraint table_constraint
) INHERITS existing_table_name;

我们来分析一下上面的语法:

  • 首先,在 CREATE TABLE 子句之后定义新表的名称。 TEMPORARY 关键字用于创建临时表。
  • 接下来,必须列出列名称、其数据类型和列约束。一个表可以有多列用逗号 (, ) 分隔。列约束定义了列的规则,例如 NOT NULL。
  • 然后,在列列表之后,必须定义一个表级约束,为表中的数据定义规则。
  • 之后,设置一个现有表,新表继承自该表。这意味着新表包含现有表的所有列和 CREATE TABLE 语句中定义的列。这是 PostgreSQL 对 SQL 的扩展。

现在让我们进入一个例子。

例子:
在这个例子中,我们将创建一个名为account的新表,它具有以下列和相应的约束:

  • user_id – 主键
  • 用户名 - 唯一且不为空
  • 密码 – 不为空
  • 电子邮件 – 唯一且不为空
  • created_on – 不为空
  • last_login – 空

以下语句创建帐户表:



CREATE TABLE account(
    user_id serial PRIMARY KEY,
    username VARCHAR (50) UNIQUE NOT NULL,
    password VARCHAR (50) NOT NULL,
    email VARCHAR (355) UNIQUE NOT NULL,
    created_on TIMESTAMP NOT NULL,
    last_login TIMESTAMP
);

以下语句创建由两列组成的角色表: role_idrole_name

CREATE TABLE role(
    role_id serial PRIMARY KEY,
    role_name VARCHAR (255) UNIQUE NOT NULL
);

以下语句创建了包含三列account_roles user_idrole_idgrant_date

CREATE TABLE account_role
(
  user_id integer NOT NULL,
  role_id integer NOT NULL,
  grant_date timestamp without time zone,
  PRIMARY KEY (user_id, role_id),
  CONSTRAINT account_role_role_id_fkey FOREIGN KEY (role_id)
      REFERENCES role (role_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT account_role_user_id_fkey FOREIGN KEY (user_id)
      REFERENCES account (user_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

让我们更详细地检查上面的语句。
account_role表的主键由两列组成: user_idrole_id ,因此我们必须使用主键表级约束来定义主键,如下所示:

PRIMARY KEY (user_id, role_id)

因为user_id列引用user_id列,所以我们需要为user_id列定义一个外键约束:

CONSTRAINT account_role_user_id_fkey FOREIGN KEY (user_id)
      REFERENCES account (user_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION

role_idcolumn 引用role_id列,我们还需要为role_id列定义一个外键约束:

CONSTRAINT account_role_role_id_fkey FOREIGN KEY (role_id)
      REFERENCES role (role_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION, 

输出: