约束

Postgres 约束是强制执行于表中数据列上的规则,用于维护数据完整性并防止插入无效数据。

创建具有主键和唯一约束的表

$$
CREATE TABLE IF NOT EXISTS employee (
  emp_id SERIAL `PRIMARY` KEY,        
  emp_name VARCHAR(50) NOT NULL,    
  emp_ssn VARCHAR (30) NOT NULL `UNIQUE`, 
  emp_salary NUMERIC(9,2) NOT NULL
);
$$

// 创建一个具有主键和唯一键约束的新表(SQL)

主键约束:强制执行列或一组列的唯一性,确保表中的每一行都有唯一的标识。

唯一约束:确保列或一组列中的所有值都是不同的,除了空值。


避免重复记录

INSERT INTO employee (emp_name, emp_ssn, emp_salary) values ('Rohit', '1234', 5000.0);
INSERT 0 1

INSERT INTO employee (emp_name, emp_ssn, emp_salary) values (Mason, '1234', 7500.0);
ERROR:  duplicate key value violates unique constraint "employee_emp_ssn_key"
DETAIL:  Key (emp_ssn)=(1234) already exists.

// 在指定唯一键约束的表中插入记录(SQL)

此表使用 emp_id 作为主键列(关键字“primary”),并在员工社会安全号码(emp_ssn)上指定唯一约束(关键字“unique”)以避免输入重复的 ssn。


创建具有检查约束的表

$$
CREATE TABLE orders(
  ord_no integer,
  ord_date date,
  ord_qty numeric,
  ord_amount numeric `CHECK (ord_amount>0)`
);
$$

// 创建一个指定检查约束的新表(SQL)

insert into orders(ord_no, ord_date, ord_qty, ord_amount) values (1, '2019-08-29', 1, 10);
INSERT 0 1 

insert into orders(ord_no, ord_date, ord_qty, ord_amount) values (2, '2019-08-29', 1, 0);
ERROR:  new row for relation "orders" violates check constraint "orders_ord_amount_check"
DETAIL:  Failing row contains (2, 2019-08-29, 1, 0).

// 在指定检查约束的表中插入记录(SQL)

检查约束(关键字“check”)在订单金额(ord_amount > 0)上指定,因此任何 ord_amount <= 0 的记录都将无法插入

检查约束:验证列或一组列中的所有值是否满足指定的条件或表达式。


定义两个表之间的关系(外键约束)

$$
CREATE TABLE IF NOT EXISTS department (
  dept_id SERIAL PRIMARY KEY,        
  dept_name VARCHAR(50) NOT NULL
);
$$
CREATE TABLE

$$
CREATE TABLE IF NOT EXISTS employee (
  emp_id SERIAL PRIMARY KEY,        
  emp_name VARCHAR(50) NOT NULL,    
  emp_ssn VARCHAR (30) NOT NULL UNIQUE, 
  emp_salary NUMERIC(9,2) NOT NULL,
  emp_dept_id INTEGER `REFERENCES` department (dept_id)    -- Foreign Key
);
$$
CREATE TABLE

// 创建 department 和 employee 表,并使用外键(“REFERENCES”)定义 employee 与 department 的关系(SQL)

外键约束:在两个表中的数据之间建立链接,通过维护链接表之间的关系来强制执行参照完整性。


检查表的约束(使用 \d 选项)

\d employee;
                                     Table "public.employee"
   Column    |         Type          |                         Modifiers                         
-------------+-----------------------+-----------------------------------------------------------
 emp_id      | integer               | not null default nextval('employee_emp_id_seq'::regclass)
. . .
Indexes:
    "employee_pkey" PRIMARY KEY, btree (emp_id)
    "employee_emp_ssn_key" UNIQUE CONSTRAINT, btree (emp_ssn)
Foreign-key constraints:
    "employee_emp_dept_id_fkey" FOREIGN KEY (emp_dept_id) REFERENCES department(dept_id)

// 显示表的约束(使用 \d 选项)(psql)