SQL六大约束!!一点就通

SQL六大约束:

在这里插入图片描述
昨天看到这个题,那么什么是SQL约束???我来给大家详细介绍一下SQL六大约束,希望对大家有所帮助!

SQL 约束:

约束
是数据库中保证数据完整性 的方法。
约束用于限制加入表的数据的类型。

可以在创建表时规定约束(通过 CREATE TABLE 语句),
或者在表创建之后也可以(通过 ALTER TABLE 语句)。

什么是数据完整性?

1.实体完整性
例如:每个表中有一个必须要指定的字段
2.区域完整性
针对表中的某个字段进行特殊化限制
3.参照完整性
表与表之间的一种特殊化关联限制

SQl约束主要有以下6种:


> 1.NOT NULL——非空约束
> 2.UNIQUE——唯一约束
> 3.PRIMARY KEY——主键约束
> 4.FOREIGN KEY——外键约束
> 5.CHECK——检查约束
> 6.DEFAULT——默认约束

1.NOT NULL 约束

NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

下面的 SQL 语句强制 “Id_P” 列和 “LastName” 列不接受 NULL 值:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

2.UNIQUE 约束:

UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

下面的 SQL 在 “Persons” 表创建时在 “Id_P” 列创建 UNIQUE 约束:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)

当表已被创建时,如需在 “Id_P” 列创建 UNIQUE 约束,请使用下列 SQL:

ALTER TABLE Persons
ADD UNIQUE (Id_P)

撤销 UNIQUE 约束

如需撤销 UNIQUE 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

3.PRIMARY KEY 约束:

PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键

下面的 SQL 在 “Persons” 表创建时在 “Id_P” 列创建 PRIMARY KEY 约束:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)

撤销 PRIMARY KEY 约束

如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP PRIMARY KEY

4.FOREIGN KEY 约束:

一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
让我们通过一个例子来解释外键。请看下面两个表:
在这里插入图片描述
“Orders” 中的 “Id_P” 列指向 “Persons” 表中的 “Id_P” 列。

“Persons” 表中的 “Id_P” 列是 “Persons” 表中的 PRIMARY KEY。

“Orders” 表中的 “Id_P” 列是 “Orders” 表中的 FOREIGN KEY。

FOREIGN KEY 约束用于预防破坏表之间连接的动作。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

下面的 SQL 在 “Orders” 表创建时为 “Id_P” 列创建 FOREIGN KEY:


CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)

5.SQL CHECK 约束:

CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

下面的 SQL 在 “Persons” 表创建时为 “Id_P” 列创建 CHECK 约束。CHECK 约束规定 “Id_P” 列必须只包含大于 0 的整数。

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

如果在表已存在的情况下为 “Id_P” 列创建 CHECK 约束,请使用下面的 SQL:

ALTER TABLE Persons
ADD CHECK (Id_P>0)

如需撤销 CHECK 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP CHECK chk_Person

6.DEFAULT 约束:

DEFAULT 约束用于向列中插入默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

下面的 SQL 在 “Persons” 表创建时为 “City” 列创建 DEFAULT 约束:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)

如果在表已存在的情况下为 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

如需撤销 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT
<think>好的,用户现在想了解SQL的完整性约束。之前他们已经问过多表联合查询,现在转向数据库的另一个重要概念,说明他们可能在深入学习数据库设计或优化方面的内容。首先,我需要回顾一下完整性约束的基本定义和类型,确保覆盖主要的关键点。 用户可能对完整性约束不太熟悉,所以需要从基础讲起,比如实体完整性、参照完整性、域完整性等。同时,要结合实际应用场景,这样用户更容易理解这些约束的作用。比如,实体完整性过主键实现,确保每行数据唯一;参照完整性过外键维护表之间的关系,防止出现无效的引用。 然后,要考虑用户可能的疑问,比如不同的约束类型如何在SQL中具体实现,可能需要示例代码。例如,创建表时如何定义主键、外键、检查约束等。还要注意用户是否了解这些约束数据库设计中的重要性,比如保证数据的一致性和准确性。 用户可能还会关心约束的命名和修改,比如如何添加或删除约束,这也是实际应用中常见的操作。需要提供相应的SQL语法示例,比如使用ALTER TABLE来添加外键约束。此外,触发器和断言虽然不常用,但作为高级内容可以简要提及,让用户有全面的了解。 还需要注意用户可能混淆的概念,比如唯一约束和主键的区别,或者检查约束与触发器的适用场景。这时候需要明确解释它们的异同,帮助用户正确选择使用哪种约束方式。 另外,考虑用户的实际操作,可能需要提醒一些注意事项,比如外键约束可能带来的性能影响,或者在插入大量数据时暂时禁用约束以提高效率。这些实战技巧对用户来说应该很有帮助。 最后,总结完整性约束的重要性,并给出学习建议,比如过实际创建表并测试约束来加深理解。可能推荐一些在线工具或练习平台,方便用户动手实践。</think>以下是关于 **SQL完整性约束** 的详细介绍,涵盖核心概念、分类及实际应用: --- ### **一、完整性约束的核心作用** 保证数据库中数据的 **准确性**、**一致性** 和 **可靠性**,防止无效或矛盾数据进入数据库。 **类比**:类似于交规则,约束数据的“行为规范”。 --- ### **二、约束类型与语法详解** #### **1. 实体完整性(Entity Integrity)** - **目标**:确保表中每行数据的唯一性 - **实现方式**:主键(`PRIMARY KEY`) ```sql CREATE TABLE Students ( student_id INT PRIMARY KEY, -- 列级约束 name VARCHAR(50) ); -- 或表级约束(联合主键) CREATE TABLE Enrollments ( student_id INT, course_id INT, PRIMARY KEY (student_id, course_id) ); ``` #### **2. 参照完整性(Referential Integrity)** - **目标**:维护表间关系的一致性 - **实现方式**:外键(`FOREIGN KEY`) ```sql CREATE TABLE Orders ( order_id INT PRIMARY KEY, customer_id INT, FOREIGN KEY (customer_id) REFERENCES Customers(customer_id) ON DELETE CASCADE -- 级联删除 ); ``` #### **3. 域完整性(Domain Integrity)** - **目标**:限定字段的取值范围 - **实现方式**: - **非空约束**:`NOT NULL` ```sql CREATE TABLE Users ( username VARCHAR(20) NOT NULL ); ``` - **唯一约束**:`UNIQUE` ```sql CREATE TABLE Products ( product_code VARCHAR(10) UNIQUE ); ``` - **检查约束**:`CHECK` ```sql CREATE TABLE Employees ( age INT CHECK (age >= 18), gender CHAR(1) CHECK (gender IN ('M', 'F')) ); ``` #### **4. 用户定义完整性(自定义规则)** - **实现方式**:触发器(`TRIGGER`)或存储过程 ```sql CREATE TRIGGER salary_check BEFORE INSERT ON Employees FOR EACH ROW BEGIN IF NEW.salary < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '薪资不能为负数'; END IF; END; ``` --- ### **三、约束操作进阶技巧** #### **1. 约束命名与修改** ```sql -- 添加命名约束 ALTER TABLE Students ADD CONSTRAINT chk_age CHECK (age BETWEEN 12 AND 25); -- 删除约束 ALTER TABLE Students DROP CONSTRAINT chk_age; ``` #### **2. 外键约束行为控制** | **操作** | **说明** | |----------------|----------------------------------| | `ON DELETE CASCADE` | 主表记录删除时,从表关联记录同步删除 | | `ON UPDATE SET NULL` | 主表主键更新时,从表外键设为 NULL | #### **3. 延迟约束检查** (适用于 PostgreSQL/Oracle) ```sql SET CONSTRAINTS ALL DEFERRED; -- 事务提交时统一检查 ``` --- ### **四、典型应用场景** 1. **电商系统** - 使用 `CHECK(quantity > 0)` 确保库存不为负 - 外键约束保证订单关联的用户必须存在 2. **金融系统** - `NOT NULL` 强制要求交易金额字段必填 - 触发器检查转账金额不超过账户余额 3. **社交平台** - `UNIQUE(email)` 防止重复注册 - `CHECK(LENGTH(password) >= 8)` 密码强度限制 --- ### **五、注意事项与优化** | **问题** | **解决方案** | |-------------------------|----------------------------------| | 过多外键影响写入性能 | 在批量导入时临时禁用约束 | | 检查约束跨表验证困难 | 改用触发器实现复杂逻辑 | | 主键选择不当导致碎片化 | 优先使用自增整型或UUID | --- ### **六、扩展知识:断言(ASSERTION)** - **作用**:跨表的全局性约束(但 MySQL 不支持) - **示例**(SQL标准语法): ```sql CREATE ASSERTION budget_limit CHECK ( NOT EXISTS ( SELECT department_id FROM Projects GROUP BY department_id HAVING SUM(budget) > 1000000 ) ); ``` --- **学习建议**: 1. 在 MySQL Workbench 或 pgAdmin 中创建带约束的表,尝试插入违反约束的数据观察报错 2. 使用 `SHOW CREATE TABLE table_name;` 查看已有表的约束定义 3. 重点理解不同约束对数据一致性的保护机制
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值