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 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)