5154

Good Luck To You!

想学习数据库约束,主键外键等常见约束的SQL语法怎么写?

在数据库设计与管理的领域中,约束条件是维护数据完整性、准确性和一致性的核心机制,它们如同为数据表设定的规则,确保了存入数据库的数据符合预设的业务逻辑和格式要求,理解并熟练书写各类约束,是每一位数据库开发者和管理员必备的技能,本文将系统性地介绍数据库中常见的约束类型及其书写方式,帮助读者构建坚实可靠的数据库结构。

想学习数据库约束,主键外键等常见约束的SQL语法怎么写?

主键约束

主键约束是数据库中最重要也是最基础的约束之一,它唯一地标识表中的每一行记录,并确保其值不能为空(NOT NULL),一个表只能有一个主键,但主键可以由一个或多个列(复合主键)组成。

在创建表时定义主键,可以直接在列定义后声明,也可以在表定义的末尾声明。

语法示例:

-- 方式一:在列定义时直接指定
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50)
);
-- 方式二:在表定义末尾指定,便于定义复合主键
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);

对于已存在的表,可以通过 ALTER TABLE 语句添加主键。

ALTER TABLE departments
ADD PRIMARY KEY (department_id);

外键约束

外键约束用于在两个表之间建立链接,强制实现引用完整性,它指向另一个表的主键,确保一个表中的外键值必须是其所引用表中已存在的值,或者为 NULL。

外键定义了“父表”(被引用的表)和“子表”(包含外键的表)之间的关系。

语法示例:

-- 创建父表
CREATE TABLE departments (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(100) NOT NULL
);
-- 创建子表,并定义外键
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

外键还支持级联操作,用于定义当父表记录被更新或删除时,子表记录的行为。

  • ON DELETE CASCADE:当父表记录被删除时,子表中所有引用该记录的行也会被自动删除。
  • ON UPDATE CASCADE:当父表主键值被更新时,子表中所有引用该值的外键值也会被自动更新。
  • ON DELETE RESTRICT(默认行为):如果子表中有记录引用父表记录,则禁止删除父表记录。
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
    ON DELETE SET NULL -- 当部门被删除时,员工的department_id设为NULL
);

唯一约束

唯一约束确保一列或多列组合中的所有值都是唯一的,但它允许有一个 NULL 值(具体行为视数据库系统而定,如 MySQL 允许多个 NULL,而 SQL Server 只允许一个),当需要保证某列信息不重复,但该列又不是主键时,唯一约束非常有用,例如用户的邮箱或手机号。

想学习数据库约束,主键外键等常见约束的SQL语法怎么写?

语法示例:

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) UNIQUE,
    email VARCHAR(100),
    CONSTRAINT uq_email UNIQUE (email) -- 使用命名约束
);

非空约束

非空约束非常简单,它强制规定某列在插入或更新记录时不能包含 NULL 值,这是保证数据质量的基本手段。

语法示例:

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    description TEXT
);
-- 为已存在的表添加非空约束(某些数据库语法可能不同)
ALTER TABLE products
ALTER COLUMN description SET NOT NULL;

检查约束

检查约束用于限制列中可以接受的值的范围,它允许你定义一个布尔表达式,插入或更新的数据必须使该表达式为真,这使得复杂的业务规则可以直接在数据库层面强制执行。

语法示例:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    salary DECIMAL(10, 2),
    CONSTRAINT chk_age CHECK (age >= 18),
    CONSTRAINT chk_salary CHECK (salary > 0)
);

在上例中,chk_age 确保员工年龄不小于18岁,chk_salary 确保薪资为正数。

默认约束

默认约束为列指定一个默认值,当插入新记录时,如果没有为该列提供值,数据库会自动使用默认值填充。

语法示例:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    order_date DATE DEFAULT CURRENT_DATE,
    status VARCHAR(20) DEFAULT 'Pending'
);

为了更直观地对比,下表小编总结了各类约束的核心信息:

想学习数据库约束,主键外键等常见约束的SQL语法怎么写?

约束类型 主要作用 典型语法示例
主键 (PRIMARY KEY) 唯一标识每一行,非空 id INT PRIMARY KEY
外键 (FOREIGN KEY) 链接两个表,保证引用完整性 FOREIGN KEY (dept_id) REFERENCES depts(id)
唯一 (UNIQUE) 保证列值唯一,允许一个NULL email VARCHAR(100) UNIQUE
非空 (NOT NULL) 确保列值不能为空 name VARCHAR(50) NOT NULL
检查 (CHECK) 限制列的取值范围 CHECK (price > 0)
默认 (DEFAULT) 为列提供默认值 status VARCHAR(20) DEFAULT 'Active'

相关问答 (FAQs)

主键和唯一约束有什么根本区别?

解答: 主要区别有三点:

  1. 唯一性数量:一个表只能有一个主键,但可以有多个唯一约束。
  2. NULL 值:主键列绝对不允许为 NULL,唯一约束列通常允许包含一个 NULL 值(具体行为取决于数据库系统,如 MySQL 允许多个 NULL,而 SQL Server 只允许一个)。
  3. 用途:主键是表的主要标识符,通常用于建立表间关系(作为外键引用),唯一约束更多用于防止业务逻辑上的重复信息,如邮箱、身份证号等。

如何修改或删除一个已经存在的约束?

解答: 可以使用 ALTER TABLE 语句配合 DROP CONSTRAINT 子句来删除约束,如果需要修改,通常的做法是先删除旧约束,再添加新的约束。

删除约束示例:

-- 删除名为 chk_salary 的检查约束
ALTER TABLE employees
DROP CONSTRAINT chk_salary;

修改约束(实际上是替换)示例: 假设我们要将 chk_age 的条件从 age >= 18 改为 age >= 21

-- 1. 删除旧约束
ALTER TABLE employees
DROP CONSTRAINT chk_age;
-- 2. 添加新约束
ALTER TABLE employees
ADD CONSTRAINT chk_age CHECK (age >= 21);

在执行这些操作时,如果约束没有命名,数据库系统会自动生成一个内部名称,你需要先查询系统表(如 information_schema)来找到这个名称,在创建约束时显式命名是一个良好的实践。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年11月    »
12
3456789
10111213141516
17181920212223
24252627282930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.