2011.11.1好日子,今天博客访问量超过1000了。 2012.01.29,访问量突破2000了. 2012.02.01,访问量突破3000了.继续进步

SQL自我培训-(SQL server约束,触发器)

上一篇 / 下一篇  2012-01-31 03:45:52 / 个人分类:SQL测试

数据库管理系统中,保证数据库中的数据完整性是非常重要的。所谓数据完整性,就是指存储在数据库中数据的一致性和正确性。约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、规则和默认值。查询优化器也使用约束定义生成高性能的查询执行计划。

数据完整性解释如下:“存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。”

 

约束是SQL Server提供的自动强制数据完整性的一种方式,它是通过定义列的取值规则来维护数据的完整性,约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、规则和默认值。查询分析器也使用约束定义生成高性能的查询执行计划。

 

SQL Server中共提供了6种约束类型,分别为:

      PRIMARY KEY(主键)约束:主键约束标识列或列集,它可用来强制数据的完整性,在数据表中主键只能有一个,主键可以是一列,也可以是由多列所组成的主键,并且主键约束不允许在创建主键的列上有空值。在一个表中,不能有两行包含相同的主键值。不能在主键内的任何列中输入NULL值。在数据库中NULL是特殊值,代表不同于空白和0值的未知值。

      FOREIGN KEY(外键)约束:外键约束标识表之间的关系。外键约束是另一个关联表的主键,可以使用外键约束为相关联的两个表建立关系,并可以维护两表之间数据的一致性。

      DEFAULT(默认)约束:默认约束用来为某一列建立一个默认值,当用户添加或修改数据时,如果用户没有对该列输入值,则SQL Server将自动为该列输入默认值。在列定义同时定义的约束称为列级完整性约束定义,作为表的独立的一项定义的完整性约束称为表级完整性约束。

      UNIQUE(惟一)约束:惟一约束在列集内强制执行值的惟一性,即在列中不允许有相同的值。但是惟一约束允许在创建惟一索引的列上有空值

      CHECK(检查)约束:检查约束主要用于强制执行域的完整性。当对数据库进行插入或修改操作时,检查新行中的列值必须满足检查约束条件,例如将商品编号设置在01000000之间,此时商品编号只能输入在01000000之间。

 

      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 ]

  }

  }

什么时候使用触发器?

实现主外键关系所不能保证的复杂参照完整性和数据的一致性。

防止恶意或错误的INSERTUPDATE以及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水平发展.

 


TAG:

 

评分:0

我来说两句

acbennn

acbennn

站在云端看浮云,晕. CSDN的博客:http://blog.csdn.net/bullswu/article/details/6798437

日历

« 2024-04-30  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 60228
  • 日志数: 44
  • 建立时间: 2011-09-18
  • 更新时间: 2013-09-22

RSS订阅

Open Toolbar