数据库基本知识
删除表
DROP TABLE
table_name
DROP TABLE IF EXISTS
table_name
约束 Constraint
约束 是数据库中的一种规则,用来限制或规范数据的存储方式。它可以确保数据的准确性、完整性和一致性。就像现实生活中的规则一样,约束告诉数据库:“这些数据必须满足某些条件,否则不能存进去。”
常见的约束类型:
-
PRIMARY KEY(主键):
- 唯一性: 保证列中的每个值都是唯一的,不允许重复。
- 非空性: 保证列中的每个值都不能为空。
- 不变性: 主键的值一旦确定,就不能轻易修改。
- 一个表格只能有一个主键约束
-
UNIQUE(唯一约束):
- 确保某一列(或一组列)中的数据是唯一的,不能重复。
- 可以为空
- 一个表格可以有多个唯一性约束
-
NOT NULL(非空约束):
- 确保某一列不能为空(必须填写)。
- 比如,用户的姓名是必填项,不能留空。
-
FOREIGN KEY(外键):
- 用来建立表与表之间的关系。
- 比如,订单表中的用户 ID 必须来自用户表,确保订单属于一个真实存在的用户。
-
CHECK(检查约束):
- 确保某一列的数据满足特定条件。
- 比如,年龄必须大于 0,或者性别只能是“男”或“女”。
总结:
- 约束 是数据库中的规则,用来保证数据的正确性和完整性。
- 常见的约束有主键、唯一约束、非空约束、外键和检查约束。
- 它们就像“数据警察”,确保数据符合要求。
表空间
表空间就是数据库中的一个逻辑存储单元,用来分类存放数据,方便管理和优化性能。就像仓库里的小房间,让数据存放更有条理!
你可以把数据库想象成一个大仓库,里面存放了很多数据。为了方便管理,这个仓库被划分成了多个小房间,每个小房间就是一个表空间。
-
表空间的作用:
表空间是用来存放数据库中的各种对象的,比如表、索引等。每个表空间可以独立管理,比如设置存储大小、备份策略等。 -
举个例子:
假设你有一个数据库用来管理一家公司的数据。你可以创建不同的表空间来存放不同的数据:- 一个表空间存放员工信息(比如员工表)。
- 另一个表空间存放财务数据(比如工资表)。
- 再一个表空间存放客户信息(比如客户表)。
这样,数据就被分类存放,管理起来更方便。
-
表空间的好处:
- 灵活性:可以根据需要调整每个表空间的大小。
- 性能优化:可以把常用的表放在高性能的存储设备上,不常用的表放在普通设备上。
- 安全性:可以为不同的表空间设置不同的权限,保护敏感数据。
数据库主键
什么是主键?
在关系型数据库中,主键(Primary Key) 是一个或多个列的组合,用于唯一标识表中的每一行数据(记录)。它就像每个人的身份证号码一样,确保每一行数据都有一个唯一的标识符。
主键的作用
- 唯一标识数据行:
- 通过主键,可以快速准确地定位到表中的特定数据行。
- 维护数据完整性:
- 主键确保了数据的唯一性和准确性,防止出现重复或错误的数据。
- 建立表之间的关系:
- 主键可以作为外键被其他表引用,从而建立表之间的关联关系。
主键的类型
- 单列主键:
- 由单个列组成的主键。
- 复合主键(联合主键):
- 由多个列组合而成的主键。当单个列无法唯一标识数据行时,可以使用复合主键。
- 自增主键:
- 数据库自动为每条新插入的记录生成唯一的主键值,常见于整数类型的主键。
主键的例子
假设我们有一个名为 students
的表,用于存储学生信息:
| id | name | age |
| --- | ---- | --- |
| 1 | 张三 | 18 |
| 2 | 李四 | 19 |
| 3 | 王五 | 20 |
在这个例子中,id
列可以作为主键,因为它满足唯一性和非空性的要求。
总结
主键是数据库中非常重要的概念,它确保了数据的唯一性和完整性,是构建关系型数据库的基础。理解和正确使用主键对于数据库的设计和开发至关重要。
存储过程(Stored Procedure)
存储过程(Stored Procedure 是数据库中的一种预编译的 SQL 代码集合,它可以被多次调用执行。存储过程通常用于封装复杂的业务逻辑,提高代码的重用性和维护性。以下是对存储过程的详细介绍:
1. 定义
存储过程是一组为了完成特定功能的 SQL 语句集合,这些语句被预先编译并存储在数据库中。用户可以通过调用存储过程的名称来执行这些 SQL 语句。
2. 优点
- 提高性能:存储过程在首次执行时会被编译,之后的调用直接使用编译后的结果,减少了重复编译的开销。
- 减少网络流量:只需传递存储过程的名称和参数,而不需要传递大量的 SQL 语句,减少了网络传输的数据量。
- 增强安全性:可以通过权限控制来限制用户对数据的直接访问,只允许通过存储过程来操作数据。
- 代码重用:存储过程可以被多个应用程序或模块调用,减少了代码的重复编写。
- 简化复杂操作:可以将复杂的业务逻辑封装在存储过程中,简化应用程序的代码。
3. 创建和使用
存储过程的创建和使用通常包括以下几个步骤:
创建存储过程
CREATE PROCEDURE 存储过程名称 (参数1 数据类型, 参数2 数据类型, ...)
AS
BEGIN
-- SQL语句
END;
例如,创建一个简单的存储过程来查询员工信息:
CREATE PROCEDURE GetEmployeeInfo @EmployeeID INT
AS
BEGIN
SELECT * FROM Employees WHERE EmployeeID = @EmployeeID;
END;
调用存储过程
EXEC 存储过程名称 参数1, 参数2, ...;
例如,调用上面创建的存储过程:
EXEC GetEmployeeInfo 1;
4. 参数类型
存储过程可以接受输入参数、输出参数和输入输出参数。
- 输入参数:用于向存储过程传递数据。
- 输出参数:用于从存储过程返回数据。
- 输入输出参数:既可以传递数据,也可以返回数据。
例如,创建一个带有输出参数的存储过程:
CREATE PROCEDURE GetEmployeeName @EmployeeID INT, @EmployeeName NVARCHAR(50) OUTPUT
AS
BEGIN
SELECT @EmployeeName = Name FROM Employees WHERE EmployeeID = @EmployeeID;
END;
调用该存储过程并获取输出参数:
DECLARE @Name NVARCHAR(50);
EXEC GetEmployeeName 1, @Name OUTPUT;
PRINT @Name;
5. 修改和删除
- 修改存储过程:使用
ALTER PROCEDURE
语句。 - 删除存储过程:使用
DROP PROCEDURE
语句。
例如,删除一个存储过程:
DROP PROCEDURE GetEmployeeInfo;
6. 适用场景
- 复杂业务逻辑:当业务逻辑复杂且需要多次执行时,使用存储过程可以提高效率。
- 数据一致性:通过存储过程可以确保数据操作的原子性和一致性。
- 权限控制:通过存储过程可以限制用户对底层数据的直接访问,增强安全性。
7. 注意事项
- 调试困难:存储过程的调试相对复杂,尤其是在处理复杂逻辑时。
- 移植性差:不同数据库系统的存储过程语法可能不同,移植时可能需要修改。
- 版本控制:存储过程的版本控制不如应用程序代码方便,需要额外的管理。
总结
存储过程是数据库中非常强大的工具,能够提高性能、增强安全性并简化复杂操作。然而,使用时也需要注意其调试和移植性等问题。合理使用存储过程可以显著提升数据库应用的效率和可维护性。
RLS(行级安全)
行级安全 (RLS) 是一种数据库安全功能,它允许你根据用户的角色或权限,限制用户可以访问的表中的行数据。 简单来说,就是根据不同的用户,筛选出他们应该看到的数据行,隐藏他们不应该看到的数据行。
行级安全是什么?
想象一下,你有一个装满数据的表格(比如员工信息表),但不同的人只能看到其中一部分数据。例如:
- 部门经理只能看到自己部门的员工数据;
- 普通员工只能看到自己的信息;
- 管理员能看到所有人的数据。
行级安全(Row-Level Security,简称RLS) 就是数据库中的一种权限控制技术,它能直接控制用户对数据表中「每一行数据」的访问权限,而不是简单地控制整个表的读写。
行级安全如何工作?
-
定义规则(策略)
管理员会设置一些规则,比如:- “用户只能看到自己部门的数据”;
- “用户只能修改自己创建的数据”。
-
自动过滤数据
当用户查询数据时,数据库会自动根据规则在查询语句中加上“隐形条件”,比如:- 普通用户查询订单表时,实际执行的语句可能是:
SELECT * FROM 订单表 WHERE 用户ID = '当前用户ID';
但用户自己并不知道这个条件的存在。
- 普通用户查询订单表时,实际执行的语句可能是:
-
对用户透明
用户以为自己直接访问了整个表,但实际上看到的只是符合规则的部分数据。
应用场景举例
-
多租户系统
比如一个云服务平台,每个租户(客户)的数据必须严格隔离,租户A看不到租户B的数据。 -
用户隐私保护
比如医疗系统中,医生只能查看自己负责的患者的病历。 -
部门数据隔离
销售部门只能看到销售数据,财务部门只能看到财务数据。
行级安全的实现方式
常见方法有两种:
-
基于角色的策略
根据用户的角色(如部门经理、员工)限制数据访问范围。 -
基于数据的属性
直接在数据行中标记属性(比如所属部门、创建人ID),通过匹配用户身份来过滤数据。
优点
- 灵活:可以针对不同用户或角色设置不同规则。
- 透明:用户无需修改查询语句,数据库自动处理。
- 集中管理:权限规则统一在数据库层控制,避免代码重复。
缺点
- 性能影响:复杂的规则可能导致查询变慢。
- 策略复杂:规则设计不当可能引发数据泄露或访问错误。
- 需要维护:随着业务变化,规则需要持续更新。