CREATE TABLE table_name
(
column_name data_type column_constraint,
column_name data_type,
...,
table_constraint
);
首先,table_name 指定了新表的名称。
括号内是字段的定义,column_name 是字段的名称,data_type 是它的类型,column_constraint 是可选的字段约束;多个字段使用逗号进行分隔。
最后,table_constraint 是可选的表级约束。
CREATE TABLE departments
( department_id INTEGER NOT NULL PRIMARY KEY
, department_name CHARACTER VARYING(30) NOT NULL
) ;
字符类型,包括定长字符串 CHAR(n),变长字符串 VARCHAR(n),以及支持更大长度的字符串 TEXT。
数字类型,包括整数类型 SMALLINT、INTEGER、BIGINT,精确数字 NUMERIC (p, s),浮点数 REAL、DOUBLE PRECISION。
时间类型,包括日期 DATE、时间 TIME、时间戳 TIMESTAMP 。
NOT NULL,非空约束,该字段的值不能为空(NULL)。
UNIQUE,唯一约束,该字段每一行的值不能重复。不过,PostgreSQL 允许该字段存在多个 NULL 值,并且将它们看作不同的值。需要注意的是 SQL 标准只允许 UNIQUE 字段中存在一个 NULL 值。
PRIMARY KEY ,主键约束,包含了 NOT NULL 约束和 UNIQUE 约束。如果主键只包含一个字段,可以通过列级约束进行定义(参考上面的示例);但是如果主键包含多个字段(复合主键)或者需要为主键指定一个自定义的名称,需要使用表级约束进行定义(参见下文示例)。
REFERENCES,外键约束,字段中的值必需已经在另一个表中存在。外键用于定义两个表之间的参照完整性(referential integrity),例如,员工的部门编号字段必须是一个已经存在的部门。
CHECK,检查约束,插入或更新数据时检查数据是否满足某个条件。例如,产品的价格必需大于零。
DEFAULT,默认值,插入数据时,如果没有为这种列指定值,系统将会使用默认值代替。
UNIQUE (column1, …),唯一约束,括号中的字段值或字段值的组合必须唯一。
PRIMARY KEY(column1, …),主键约束,定义主键或者复合主键。
REFERENCES,定义外键约束。
CHECK,定义检查约束。
CREATE TABLE employees
( employee_id INTEGER NOT NULL
, first_name CHARACTER VARYING(20)
, last_name CHARACTER VARYING(25) NOT NULL
, email CHARACTER VARYING(25) NOT NULL
, phone_number CHARACTER VARYING(20)
, hire_date DATE NOT NULL
, salary NUMERIC(8,2)
, commission_pct NUMERIC(2,2)
, manager_id INTEGER
, department_id INTEGER
, CONSTRAINT emp_emp_id_pk
PRIMARY KEY (employee_id)
, CONSTRAINT emp_salary_min
CHECK (salary > 0)
, CONSTRAINT emp_email_uk
UNIQUE (email)
, CONSTRAINT emp_dept_fk
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
, CONSTRAINT emp_manager_fk
FOREIGN KEY (manager_id)
REFERENCES employees(employee_id)
) ;
employee_id,员工编号,整数类型,主键(通过表级约束为主键指定了名称 emp_emp_id_pk);
first_name,名,字符串;
last_name,姓,字符串,不能为空;
email,电子邮箱,字符串,不能为空,必须唯一(emp_email_uk);
phone_number,电话号码,字符串;
hire_date,雇佣日期,日期类型,不能为空;
salary,薪水,数字类型,必须大于零(emp_salary_min);
commission_pct,佣金百分比,数字类型;
manager_id,经理编号,外键(通过外键 emp_manager_fk 引用员工表的员工编号);
department_id,部门编号,外键(通过外键 emp_dept_fk 引用部门表 departments 的编号 department_id)
CREATE TABLE table_name
AS query;
SELECT ...
INTO new_table
FROM ...;
CREATE TABLE emp1
AS
SELECT *
FROM employees;
SELECT *
INTO emp2
FROM employees;
CREATE TABLE schema_name.table_name
...
testdb=> SHOW search_path;
search_path
-----------------
"$user", public
(1 row)
testdb=> SELECT user;
user
------
tony
(1 row)
testdb=> \dn
List of schemas
Name | Owner
--------+----------
app | tony
public | postgres
(2 rows)
testdb=> \d
List of relations
Schema | Name | Type | Owner
--------+-------------+-------+-------
public | departments | table | tony
public | emp1 | table | tony
public | emp2 | table | tony
public | employees | table | tony
(4 rows)
SET search_path TO app,public;
ALTER TABLE name action;
添加字段
删除字段
添加约束
删除约束
修改字段默认值
修改字段数据类型
重命名字段
重命名表
ALTER TABLE table_name
ADD COLUMN column_name data_type column_constraint;
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
ALTER TABLE products ADD COLUMN description text;
-- 插入一行数据
testdb=> INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);
INSERT 0 1
testdb=> ALTER TABLE products ADD COLUMN notes text not null;
ERROR: column "notes" contains null values
testdb=> ALTER TABLE products ADD COLUMN notes text DEFAULT 'new product' not null;
ALTER TABLE
testdb=> SELECT * FROM products;
product_no | name | price | description | notes
------------+--------+-------+-------------+-------------
1 | Cheese | 9.99 | | new product
(1 row)
ALTER TABLE table_name
DROP COLUMN column_name;
estdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------------------
product_no | integer | | not null |
name | text | | |
price | numeric | | |
description | text | | |
notes | text | | not null | 'new product'::text
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
Check constraints:
"products_description_check" CHECK (description <> ''::text)
testdb=> ALTER TABLE products DROP COLUMN notes;
ALTER TABLE
testdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
product_no | integer | | not null |
name | text | | |
price | numeric | | |
description | text | | |
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
testdb=> ALTER TABLE departments DROP COLUMN department_id;
ERROR: cannot drop column department_id of table departments because other objects depend on it
DETAIL: constraint emp_dept_fk on table employees depends on column department_id of table departments
HINT: Use DROP ... CASCADE to drop the dependent objects too.
testdb=> ALTER TABLE departments DROP COLUMN department_id CASCADE;
NOTICE: drop cascades to constraint emp_dept_fk on table employees
ALTER TABLE
ALTER TABLE table_name ADD table_constraint;
testdb=> ALTER TABLE products ADD CONSTRAINT products_price_min CHECK (price > 0);
ALTER TABLE
testdb=> ALTER TABLE products ADD CONSTRAINT products_name_uk UNIQUE (name);
ALTER TABLE
testdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
product_no | integer | | not null |
name | text | | |
price | numeric | | |
description | text | | |
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
"products_name_uk" UNIQUE CONSTRAINT, btree (name)
Check constraints:
"products_price_min" CHECK (price > 0::numeric)
ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;
testdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
product_no | integer | | not null |
name | text | | not null |
price | numeric | | |
description | text | | |
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
"products_name_uk" UNIQUE CONSTRAINT, btree (name)
Check constraints:
"products_price_min" CHECK (price > 0::numeric)
ALTER TABLE table_name DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ];
testdb=> ALTER TABLE products DROP CONSTRAINT products_name_uk;
ALTER TABLE
testdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
product_no | integer | | not null |
name | text | | not null |
price | numeric | | |
description | text | | |
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
Check constraints:
"products_price_min" CHECK (price > 0::numeric)
ALTER TABLE table_name ALTER COLUMN column_name DROP NOT NULL;
testdb=> ALTER TABLE products ALTER COLUMN name DROP NOT NULL;
ALTER TABLE
testdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
product_no | integer | | not null |
name | text | | |
price | numeric | | |
description | text | | |
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
Check constraints:
"products_price_min" CHECK (price > 0::numeric)
ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT value;
testdb=> ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
ALTER TABLE
testdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
product_no | integer | | not null |
name | text | | |
price | numeric | | | 7.77
description | text | | |
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
Check constraints:
"products_price_min" CHECK (price > 0::numeric)
ALTER TABLE table_name ALTER COLUMN column_name DROP DEFAULT;
testdb=> ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
ALTER TABLE
testdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
product_no | integer | | not null |
name | text | | |
price | numeric | | |
description | text | | |
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
Check constraints:
"products_price_min" CHECK (price > 0::numeric)
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type;
testdb=> ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
ALTER TABLE
testdb=> \d products;
Table "public.products"
Column | Type | Collation | Nullable | Default
-------------+---------------+-----------+----------+---------
product_no | integer | | not null |
name | text | | |
price | numeric(10,2) | | |
description | text | | |
Indexes:
"products_pkey" PRIMARY KEY, btree (product_no)
Check constraints:
"products_price_min" CHECK (price > 0::numeric)
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type USING expression;
testdb=> ALTER TABLE products ADD COLUMN level VARCHAR(10);
ALTER TABLE
testdb=> ALTER TABLE products ALTER COLUMN level TYPE INTEGER;
ERROR: column "level" cannot be cast automatically to type integer
HINT: You might need to specify "USING level::integer".
testdb=> ALTER TABLE products ALTER COLUMN level TYPE INTEGER USING level::integer;
ALTER TABLE
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
ALTER TABLE products
RENAME COLUMN product_no TO product_number;
ALTER TABLE table_name
RENAME TO new_name;
ALTER TABLE products
RENAME TO items;
DROP TABLE [ IF EXISTS ] name [ CASCADE | RESTRICT ];
testdb=> DROP TABLE emp1;
DROP TABLE
原文作者:SQL编程思想;如有侵权,请联系管理员删除。