PostgreSQL 约束(Constraints)详解
                           
天天向上
发布: 2025-03-12 23:30:40

原创
276 人浏览过

PostgreSQL约束(Constraints)用于确保数据库数据的完整性和一致性。PostgreSQL 提供了多种约束类型,包括 NOT NULLUNIQUEPRIMARY KEYFOREIGN KEYCHECKDEFAULTEXCLUSION 约束。


1. NOT NULL 约束

用于确保某列的值不能为 NULL,适用于关键数据字段。

1.1 语法

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

1.2 示例

INSERT INTO users (id, name) VALUES (1, NULL);
-- 报错:违反 NOT NULL 约束

1.3 删除 NOT NULL 约束

ALTER TABLE users ALTER COLUMN name DROP NOT NULL;

2. UNIQUE 约束

确保某列或多个列的值在表中是唯一的。

2.1 语法

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE
);

2.2 复合 UNIQUE 约束

CREATE TABLE employees (
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    UNIQUE (first_name, last_name)
);

2.3 违反 UNIQUE 约束示例

INSERT INTO users (email) VALUES ('user@example.com');
INSERT INTO users (email) VALUES ('user@example.com');
-- 报错:违反 UNIQUE 约束

2.4 删除 UNIQUE 约束

ALTER TABLE users DROP CONSTRAINT users_email_key;

3. PRIMARY KEY 约束

PRIMARY KEY 约束由 UNIQUENOT NULL 组合而成,每张表只能有一个主键。

3.1 语法

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    order_number VARCHAR(50) NOT NULL UNIQUE
);

3.2 复合主键

CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    PRIMARY KEY (order_id, product_id)
);

3.3 删除 PRIMARY KEY

ALTER TABLE orders DROP CONSTRAINT orders_pkey;

4. FOREIGN KEY 约束

FOREIGN KEY 约束用于维护表与表之间的关系,确保引用的值在父表中存在。

4.1 语法

CREATE TABLE users (
    id SERIAL PRIMARY KEY
);

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id) ON DELETE CASCADE
);

4.2 级联删除(ON DELETE CASCADE)

如果 users 表的某条记录被删除,orders 表中关联的数据也会被删除。

DELETE FROM users WHERE id = 1;
-- 该用户的所有订单也会被删除

4.3 删除 FOREIGN KEY

ALTER TABLE orders DROP CONSTRAINT orders_user_id_fkey;

5. CHECK 约束

CHECK 约束用于限制列的值符合某个条件。

5.1 语法

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    price DECIMAL CHECK (price > 0)
);

5.2 复杂 CHECK 约束

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    age INT CHECK (age >= 18 AND age <= 65)
);

5.3 违反 CHECK 约束示例

INSERT INTO employees (age) VALUES (17);
-- 报错:违反 CHECK 约束

5.4 删除 CHECK 约束

ALTER TABLE employees DROP CONSTRAINT employees_age_check;

6. DEFAULT 约束

用于指定默认值。

6.1 语法

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

6.2 使用 DEFAULT

INSERT INTO users (id) VALUES (1);
SELECT * FROM users;
-- created_at 将自动填充当前时间

6.3 修改 DEFAULT

ALTER TABLE users ALTER COLUMN created_at SET DEFAULT NOW();

6.4 删除 DEFAULT

ALTER TABLE users ALTER COLUMN created_at DROP DEFAULT;

7. EXCLUSION 约束

EXCLUSION 约束用于确保数据范围或表达式的唯一性,常用于 RANGE 数据类型。

7.1 语法

CREATE TABLE room_reservations (
    id SERIAL PRIMARY KEY,
    room_id INT,
    period TSRANGE,
    EXCLUDE USING GIST (room_id WITH =, period WITH &&)
);

7.2 作用

  • room_id WITH = 确保 room_id 不能重复。
  • period WITH && 确保时间范围不能重叠。

7.3 删除 EXCLUSION 约束

ALTER TABLE room_reservations DROP CONSTRAINT room_reservations_exclusion;

8. 添加、删除和修改约束

8.1 添加 NOT NULL 约束

ALTER TABLE users ALTER COLUMN name SET NOT NULL;

8.2 添加 UNIQUE 约束

ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);

8.3 添加 CHECK 约束

ALTER TABLE employees ADD CONSTRAINT check_age CHECK (age >= 18);

8.4 删除约束

ALTER TABLE users DROP CONSTRAINT unique_email;

总结

约束类型作用
NOT NULL确保列值不能为空
UNIQUE确保列值唯一
PRIMARY KEY唯一且非空,每个表只能有一个
FOREIGN KEY维护表之间的关系
CHECK限制列值的范围或条件
DEFAULT指定列的默认值
EXCLUSION确保数据范围或表达式的唯一性

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *