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_id
和role_name
:
CREATE TABLE role(
role_id serial PRIMARY KEY,
role_name VARCHAR (255) UNIQUE NOT NULL
);
以下语句创建了包含三列account_roles
user_id
、 role_id
和grant_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_id
和role_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,
输出: