在数据库管理系统中,保证数据库中的数据完整性是非常重要的。所谓数据完整性,就是指存储在数据库中数据的一致性和正确性。约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、规则和默认值。查询优化器也使用约束定义生成高性能的查询执行计划。
数据完整性解释如下:“存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。”
约束是SQL Server提供的自动强制数据完整性的一种方式,它是通过定义列的取值规则来维护数据的完整性,约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、规则和默认值。查询分析器也使用约束定义生成高性能的查询执行计划。
SQL Server中共提供了6种约束类型,分别为:
PRIMARY KEY(主键)约束:主键约束标识列或列集,它可用来强制数据的完整性,在数据表中主键只能有一个,主键可以是一列,也可以是由多列所组成的主键,并且主键约束不允许在创建主键的列上有空值。在一个表中,不能有两行包含相同的主键值。不能在主键内的任何列中输入NULL值。在数据库中NULL是特殊值,代表不同于空白和0值的未知值。
FOREIGN KEY(外键)约束:外键约束标识表之间的关系。外键约束是另一个关联表的主键,可以使用外键约束为相关联的两个表建立关系,并可以维护两表之间数据的一致性。
DEFAULT(默认)约束:默认约束用来为某一列建立一个默认值,当用户添加或修改数据时,如果用户没有对该列输入值,则SQL Server将自动为该列输入默认值。在列定义同时定义的约束称为列级完整性约束定义,作为表的独立的一项定义的完整性约束称为表级完整性约束。
UNIQUE(惟一)约束:惟一约束在列集内强制执行值的惟一性,即在列中不允许有相同的值。但是惟一约束允许在创建惟一索引的列上有空值。
CHECK(检查)约束:检查约束主要用于强制执行域的完整性。当对数据库进行插入或修改操作时,检查新行中的列值必须满足检查约束条件,例如将商品编号设置在0~1000000之间,此时商品编号只能输入在0到1000000之间。
NOT NULL(非空)约束:非空约束用来强制数据的域完整性,它用于将某列值设置成不能为空,如果将某列设置为非空之后,则在添加数据或修改数据时,都不可将此列设置为空值。
主键约束和唯一约束的区别和不同使用情况:
尽管唯一约束和主键都强制唯一性,但如果情况如下,则应向表附加唯一约束而不是主键约束:
希望在某一列或某一组列中强制唯一性。您可以向表附加多个唯一约束,但只能向表附加一个主键约束。
希望在允许空值的列中强制唯一性。您可以向允许空值的列附加唯一约束,但只能向不允许空值的列附加主键约束。当向允许空值的列附加唯一约束时,请确保在所约束的列中最多只有一行包含空值。
使用SQL语句创建检查约束语法:
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
CHECK (logical_expression)
添加'性别'的约束:
USE test --数据库名
ALTER TABLE testTable
ADD
CONSTRAINT CK_Tabletest2 CHECK (性别='男' or性别='女')
删除约束: DROP CONSTRAINT constraint_name
ALTER TABLE testTable
DROP constraint CK_Tabletest2
创建DEFAULT约束
[ CONSTRAINT DEFAULT Constraint_name]
DEFAULT Constraint_expression
删除DEFAULT约束
DROP CONSTRAINT DEFAULT Constraint_name
增加DEFAULT约束:
ALTER TABLE testTable
ADD CONSTRAINT DE_性别DEFAULT '男' FOR性别
删除
ALTER TABLE testTable
DROP CONSTRAINT DE_性别
主键约束:
USE test
GO
ALTER TABLE testTable
ADD CONSTRAINT PK_编号PRIMARY KEY CLUSTERED (编号,ISBN)
删除主键:
USE test
GO
ALTER TABLE testTable
DROP CONSTRAINT PK_编号
FOREIGN KEY约束
注意:建立外键的关键是某列必须是两张表中的同名,同数据类型列,且该列为一张表的主键,该列为另一张表的外键.
首先主键:
USE test
GO
ALTER TABLE Table_test
ADD CONSTRAINT PK_编号PRIMARY KEY CLUSTERED (编号)
再设置外键约束:
USE test
GO
ALTER TABLE testTable
ADD CONSTRAINT FK_编号FOREIGN KEY (编号) REFERENCES Table_test (编号)
删除外键约束:
USE test
GO
ALTER TABLE testTable
DROP CONSTRAINT FK_testTable_Table_test
UNIQUE约束:
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
为了让命名一个独特的制约因素,并确定了唯一约束上多列,请使用下面的SQL语法:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
数据库独特的制约因素改变表要创建一个唯一约束的“P_Id”一栏时,表是已经建立,请使用下面的SQL:
ALTER TABLE Persons
ADD UNIQUE (P_Id)
触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。它与普通存储过程不同之处在于触发器的执行是由事件触发的,而普通存储过程是由命令调用执行的.
比较触发器与约束:
约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用Transact-SQL代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法,触发器是在对表进行增、删、改时,自动执行的存储过程。触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行.触发器是一个特殊的事务单元,可以引用其他表中的列执行特殊的业务规则或数据逻辑关系。当出现错误时,可以执行rollback transaction操作将整个触发器以及触发它的T-SQL语句一并回滚(不需显示声明begin transaction)
SQL触发器语法
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ DELETE ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) updated_bitmask )
column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
什么时候使用触发器?
实现主外键关系所不能保证的复杂参照完整性和数据的一致性。
防止恶意或错误的INSERT、UPDATE以及DELETE操作,并强制执行比CHECK约束定义的限制更为复杂的其他限制。
与CHECK约束不同(check约束只能引用自身表中的列),DML触发器可以引用其他表中的列;
示例:
create trigger trig_delete_transInfo
on transInfo after delete -- for | after
as
print '开始备份数据,请稍后......'
--如果数据库中,不存在backupTable表
if not exists(select * from sysobjects
where name='backupTable')
select * into backupTable from deleted --deleted临时表
else
insert into backupTable select * from deleted
print '备份成功,备份表backupTable中的数据为:'
select * from backupTable;
go
总结:学习触发器的过程中觉得是个不错的东西,但是多了管理起来个人觉得会比较困难,同时在学习约束和触发器过程中,作为一个应该是初级DBA水平(可能还没有)的我,需要认真通过实践知道索引,约束,触发器,游标,存储过程的使用场景和其中几个相似功能的区别和联系.结合基础的增删改查,连接查询,子查询等,慢慢积累往熟练级DBA水平发展.