跳转到内容

SQL约束条件

来自代码酷
Admin留言 | 贡献2025年5月12日 (一) 00:20的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

SQL约束条件[编辑 | 编辑源代码]

SQL约束条件(SQL Constraints)是应用于数据库表中列或表的规则,用于限制可以存储的数据类型。这些约束条件帮助维护数据的准确性、完整性和一致性,是关系型数据库设计的核心组成部分。

概述[编辑 | 编辑源代码]

SQL约束条件定义了数据库中数据的有效性和关系规则。它们可以应用于列级别(仅影响单个列)或表级别(影响多个列)。约束条件在创建表时定义(通过CREATE TABLE语句),也可以在表创建后通过ALTER TABLE语句添加。

主要的SQL约束条件包括:

  • NOT NULL - 确保列不能存储NULL值
  • UNIQUE - 确保列中的所有值都不同
  • PRIMARY KEY - 唯一标识表中的每一行
  • FOREIGN KEY - 确保一个表中的数据匹配另一个表中的值
  • CHECK - 确保列中的值满足特定条件
  • DEFAULT - 为列设置默认值

详细约束类型[编辑 | 编辑源代码]

NOT NULL 约束[编辑 | 编辑源代码]

NOT NULL约束强制列不接受NULL值,这意味着必须始终包含一个值。

CREATE TABLE Employees (
    EmployeeID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255) NOT NULL,
    Age int
);

在此示例中,EmployeeID、LastName和FirstName列不能包含NULL值,而Age列可以。

UNIQUE 约束[编辑 | 编辑源代码]

UNIQUE约束确保列中的所有值都不同。

CREATE TABLE Persons (
    ID int NOT NULL UNIQUE,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

或者使用表级约束:

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    UNIQUE (ID)
);

PRIMARY KEY 约束[编辑 | 编辑源代码]

PRIMARY KEY约束唯一标识表中的每条记录。主键必须包含UNIQUE值且不能包含NULL值。

CREATE TABLE Customers (
    CustomerID int NOT NULL PRIMARY KEY,
    CustomerName varchar(255) NOT NULL,
    ContactName varchar(255),
    Country varchar(255)
);

对于复合主键:

CREATE TABLE OrderDetails (
    OrderID int NOT NULL,
    ProductID int NOT NULL,
    Quantity int,
    PRIMARY KEY (OrderID, ProductID)
);

FOREIGN KEY 约束[编辑 | 编辑源代码]

FOREIGN KEY约束用于防止破坏表之间链接的操作,它指向另一个表中的PRIMARY KEY。

CREATE TABLE Orders (
    OrderID int NOT NULL PRIMARY KEY,
    OrderNumber int NOT NULL,
    CustomerID int,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

CHECK 约束[编辑 | 编辑源代码]

CHECK约束限制列中可以放置的值范围。

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    CHECK (Age>=18)
);

DEFAULT 约束[编辑 | 编辑源代码]

DEFAULT约束为列提供默认值。

CREATE TABLE Orders (
    ID int NOT NULL,
    OrderNumber int NOT NULL,
    OrderDate date DEFAULT GETDATE()
);

约束的实际应用案例[编辑 | 编辑源代码]

用户注册系统[编辑 | 编辑源代码]

在一个用户注册系统中,我们可以使用多种约束来确保数据质量:

CREATE TABLE Users (
    UserID int NOT NULL PRIMARY KEY,
    Username varchar(50) NOT NULL UNIQUE,
    Email varchar(100) NOT NULL UNIQUE,
    PasswordHash varchar(255) NOT NULL,
    RegistrationDate datetime DEFAULT CURRENT_TIMESTAMP,
    Age int CHECK (Age >= 13),
    CountryCode char(2) REFERENCES Countries(Code)
);

这个表定义使用了: 1. PRIMARY KEY约束确保每个用户有唯一标识 2. NOT NULL约束确保关键信息不缺失 3. UNIQUE约束防止用户名和邮箱重复 4. DEFAULT约束自动记录注册时间 5. CHECK约束确保用户年龄符合要求 6. FOREIGN KEY约束关联国家代码表

约束的添加与删除[编辑 | 编辑源代码]

添加约束[编辑 | 编辑源代码]

可以在表创建后添加约束:

ALTER TABLE Persons
ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND Age<=120);

删除约束[编辑 | 编辑源代码]

要删除约束:

ALTER TABLE Persons
DROP CONSTRAINT CHK_PersonAge;

约束的级联操作[编辑 | 编辑源代码]

对于FOREIGN KEY约束,可以定义级联操作:

CREATE TABLE Orders (
    OrderID int NOT NULL PRIMARY KEY,
    CustomerID int NOT NULL,
    OrderDate datetime,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
    ON DELETE CASCADE
    ON UPDATE NO ACTION
);

级联选项包括:

  • NO ACTION - 默认,阻止删除/更新
  • CASCADE - 级联删除/更新相关行
  • SET NULL - 将外键值设为NULL
  • SET DEFAULT - 将外键值设为默认值

约束的性能考虑[编辑 | 编辑源代码]

虽然约束对于数据完整性至关重要,但它们确实会带来性能开销:

  • 每次插入、更新或删除操作都需要验证约束
  • 外键约束需要检查引用完整性
  • 复杂的CHECK约束可能影响性能

在设计大型数据库时,需要在数据完整性和性能之间找到平衡。

约束的验证与禁用[编辑 | 编辑源代码]

在某些情况下(如大数据导入),可能需要临时禁用约束:

-- 禁用所有约束
ALTER TABLE Orders NOCHECK CONSTRAINT ALL;

-- 重新启用
ALTER TABLE Orders CHECK CONSTRAINT ALL;

-- 禁用特定约束
ALTER TABLE Orders NOCHECK CONSTRAINT FK_Orders_Customers;

总结[编辑 | 编辑源代码]

SQL约束条件是数据库设计的基础工具,它们确保:

  • 数据的准确性和一致性(通过NOT NULL、CHECK等)
  • 数据的唯一性(通过PRIMARY KEY、UNIQUE)
  • 表之间的关系完整性(通过FOREIGN KEY)
  • 合理的默认值(通过DEFAULT)

合理使用约束可以显著减少应用程序中的错误检查代码,将数据验证逻辑集中在数据库层。

参见[编辑 | 编辑源代码]