一、数据库完整性
数据库完整性是指数据库中数据的正确性和相容性。
完整性约束条件的作用对象
- 列级约束: 包括对列的类型、取值范围、精度等的约束
- 元组约束: 指元组中各个字段之间的相互约束
- 表级约束: 指若干元组、关系之间的联系的约束
定义与实现完整性约束:实体完整性 、参照完整性、 用户定义的完整性
**************************实体完整性**************************
实体完整性 :在MySQL中,实体完整性是通过主键约束和候选键约束实现的。
主键列必须遵守的规则
- 每一个表只能定义一个主键
- 主键的值(键值)必须能够唯一标志表中的每一行记录,且不能为NULL
- 复合主键不能包含不必要的多余列
- 一个列名在复合主键的列表中只能出现一次
主键约束与候选键约束的区别
- 主键约束 一个表只能创建 一个主键 关键字 PRIMARY KEY
- 候选键约束 可以定义 若干个候选键 关键字 UNIQUE
***********************参照完整性*******************************
REFERENCES tbl_name(index_col_name,…) [ON DELETE reference_option] [ON UPDATE reference_option]
tbl_name:指定外键所参照的表名
index_col_name:指定被参照的列名
ON DELETE:指定参照动作相关的SQL语句
reference_option:指定参照完整性约束的实现策略 (RESTRICT-限制策略 | CASCADE-级联策略 | SET NULL-置空策略 | NO ACTION-不采取实施策略)
**********************用户定义的完整性****************************
非空约束:NOT NULL
CHECK 约束:CHECK(expr)
命名完整性约束:CONSTRAINT [symbol] symbol:指定的约束名字
只能给基于表的完整性约束指定名字,无法给基于列的完整性约束指定名字
命名完整性约束的方法是在各种完整性约束的定义说明之前加上关键字( CONSTRAINT )和该约束的名字
更新完整性约束
使用ALTER TABLE语句更新与列或表有关的各种约束。
- 1、完整性约束不能直接被修改。(先删除,再增加)
- 2、使用ALTER TABLE语句,可以独立地删除完整性约束,而不会删除表 本身。(DROP TABLE语句删除一个表,则表中所有的完整性约束都会被 自动删除)
二、触发器
什么是触发器:是用户定义在关系表上的一类由事件驱动的数据对象, 也是一种保证数据完整性的方法。
*************************创建触发器******************************
使用CREATE TRIGGER语句创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body
trigger_name:指定触发器的名称
trigger_time:指定触发器被触发的时刻
trigger_event:指定触发器的触发事件
tbl_name:指定与触发器相关联的表名
FOR EACH ROW :指定对于受触发事件影响的每一 行都要激活触发器的动作
trigger_body:指定触发器动作主体
例如:在数据库mysql_test的表customers中创建一个触发器 customers_insert_trigger,用于每次向表customers插入一行数据时, 将用户变量str的值设置为one customer added!
CREATE TRIGGER mysql_test.customers_insert_trigger AFTER INSERT -> ON mysql_test.customers FOR EACH ROW SET @str=‘one customer added!’
使用DROP语句删除触发器
语法:DROP TRIGGER [IF EXISTS][schema_name.]trigger_name
- IF EXISTS:用于避免在没有触发器的 情况下删除触发器
- schema_name:指定触发器所在的数据库的名称
- trigger_name:指定要删除的触发器名称
例如:DROP TRIGGER IF EXISTS mysql_test.customers_insert_trigger;
使用触发器
INSERT触发器 DELETE触发器 UPDATE触发器
*******************INSERT触发器***********************
在INSERT触发器代码内,可引用一个名为NEW(不区分大小写)的虚拟 表,来访问被插入的行。 在BEFORE INSERT触发器中,NEW中的值可以被更新
例如:在数据库mysql_test的表customers中重新创建触发器 customers_insert_trigger,用于每次向表customers插入一行数据时, 将用户变量str的值设置为新插入客户的id号。
CREATE TRIGGER mysql_test.customers_insert_trigger AFTER INSERT -> ON mysql_test.customers FOR EACH ROW SET @str=NEW.cust_id;
********************DELETE触发器*************************
在DELETE触发器代码内,可引用一个名为OLD(不区分大小写)的虚拟 表,来访问被删除的行。 OLD中的值全部是只读的,不能被更新。
*******************UPDATE触发器***************************
在UPDATE触发器代码内,可引用一个名为OLD(不区分大小写)的虚拟 表,来访问UPDATE语句执行前的值,也可以引用一个名为NEW(不区 分大小写)的虚拟表来访问更新后的值
例如:在数据库mysql_test的表customers中创建一个触发器 customers_update_trigger,用于每次更新表customers时,将该表中cust_address列 的值设置为cust_contact列的值。
CREATE TRIGGER mysql_test.customers_update_trigger BEFORE UPDATE -> ON mysql_test.customers FOR EACH ROW -> SET NEW.cust_address=OLD.cust_contact;
三、安全性与访问控制
数据库的安全性是指保护数据