- 浏览: 1891440 次
- 性别:
- 来自: 合肥
-
文章分类
- 全部博客 (514)
- OPEN (41)
- WARN (33)
- EXPER (16)
- RESOURCE (7)
- TOOL (4)
- DWR (10)
- Struts1.x (10)
- Ibtais (18)
- MyEclipse (30)
- Sql Server (64)
- Tomcat (7)
- APACHE (4)
- JSP (18)
- SERVLET (6)
- ENGLISH (0)
- ECSide (8)
- JasperReports (7)
- JAVA (24)
- JS (42)
- XML (26)
- CVS (8)
- Mind (1)
- JQUERY (2)
- IBATIS (6)
- PROJECT (0)
- STRUTS2 (0)
- PROXOOL (0)
- SPRING (4)
- Hibernate (0)
- SSI (0)
- JBPM (11)
- FLEX (3)
- JSON (2)
- GWT (1)
- jeecms v3 (1)
- Flash (2)
- DATA (1)
- ORACLE (3)
- 查询oracle 中逗号分隔字符串中所有值 (1)
最新评论
-
小小西芹菜:
GoEasy web三步轻松实现web实时推送1. 引入goe ...
服务器推送技术 java -
kg_1997:
这个方法太棒了,可以不用to_date函数,实在是棒!!!
java/oracle日期处理 -
wodesunday:
:idea:
SQL的分段统计查询语句 -
wodesunday:
引用
SQL的分段统计查询语句 -
BlueSkator:
讲的有点浅,没有深入进去
tomcat需要的重新发布和重启服务器的几种情况
SQL Server 2000支持下列五类约束:(1)DEFAULT约束(默认约束):当向数据库表中插入数据时,如果没有明确的提供输入值时,SQL S自动为该列输入指定值。(2)CHECK约束(检查约束):通过逻辑表达式判断限制插入到列中的值。(3)PRIMARY KEY约束(主键约束):不允许数据库表在指定列上具有相同的值,且不允许有空值。(4)FOREIGN KEY约束(外键约束):定义数据库表中指定列上插入或更新的数值必须在另一张被参照表中的特定列上存在。(5)UNIQUE约束(惟一约束):不允许数据库表在指定列上具有相同的值,但允许有空值。约束也被分为列约束和表约束两类。列约束是指只对某一列起作用的约束。当一个约束中包含了数据库表中一个以上的列时,称为表约束。
24、约束的创建 约束可以通过使用CREATE TABLE命令创建。 具体语法如下: CREATE TABLE table_name (column_name data_type (NULL | NOT NULL)[[CONSTRAINT constraint_name]{PRIMARY KEY [CLUSTERED | NONCLUSTERED] | UNIQUE [CLUSTERED | NONCLUSTERED] | [FOREIGN KEY] REFERENCES ref_table [(ref_column)] | DEFAULT constant_expression | CHECK(logical_expression)}][,...]) 其中,各参数的意义为: table_name:创建约束的表名称 column_name:创建约束的列的名称 data_type:所在列的数据类型 constraint_name:新建约束的名称
[例题37] 在tsinghua数据库中创建一张用于教师信息管理的表teachers,表中包括的教师信息分别为:教师编号、教师姓名、性别、出身年月、所在系代号、职称、办公室电话号码、科研方向以及工作状态,在创建时定义有列约束和表约束。 具体命令如下: use tsinghua CREATE TABLE tsinghua.dbo.teachers (TeacherID int NOT NULL, name nvarchar(5) NOT NULL, gender nchar(1) NULL, birthday datetime NULL, DeptCode tinyint NOT NULL, Title nvarchar(5) NULL, TelCode char(8) NOT NULL, aspect nvarchar(200) NULL, status nvarchar(5) NOT NULL CONSTRAINT DF_Status DEFAULT('在职'), CONSTRAINT PK_Teacher PRIMARY KEY CLUSTERED(TeacherID), CONSTRAINT FK_DeptCode FOREIGN KEY (DeptCode) REFERENCES dbo.departments(DeptCode), CONSTRAINT CK_TelCode CHECK(TelCode LIKE '627[0-9][0-9][0-9][0-9][0-9]'),) go 在这个例子中,用户可以看到我们使用的约束类型依次为非空约束、默认约束、主键约束、外键约束和检查约束。 在结果显示窗口中可以看到错误提示:
服务器: 消息 1767,级别 16,状态 1,行 2 外键 'FK_DeptCode' 引用了无效的表 'dbo.departments'。 服务器: 消息 1750,级别 16,状态 1,行 2 未能创建约束。请参阅前面的错误信息。
这是由于还没有在数据库tsinghua中创建外键约束FK_DeptCode所需表departments,用户可以通过下面指令先创建表departments: CREATE TABLE tsinghua.dbo.departments (DeptCode tinyint NOT NULL Primary Key, DeptName nchar(20) NOT NULL, TelCode char(8) NULL) go
25、查看约束的定义信息 在CREATE TABLE语句中使用CONSTRAINT定义完整约束时,其约束命名必须在数据库中保持惟一,此外还应遵从SQL Server的标志符规则。 约束在创建后SQL Server将指导约束的名称保存在系统表sysobjects中,并把创建的文本代码保存在系统表syscomments中。SQL Server为用户提供了多种查看约束信息的方法。(1)使用系统存储过程 用户可以通过使用系统存储过程sp_help,sp_helptext,sp_helpconstraint来查看约束的相关信息。 具体命令的语法如下: EXEC sp_help (sp_helptext,sp_helpconstraint) 其中:sonstraint_name为需要查看的约束的名称。
[例题38] 使用系统存储过程sp_helptext查看表teachers上约束CK_TelCode的定义文本信息。 具体命令如下: use tsinghua EXEC sp_helptext CK_TelCode go(2)使用规划视图 用户还可以通过查询系统规划视图check_constraints,referential_constraints,table_constraints得到约束的相关信息。
[例题39] 使用系统规划视图check_constraints查看数据库tsinghua上存在的所有约束的相关信息。 具体命令如下: use pubs SELECT * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS go (3)使用“企业管理器”
26、删除约束 要删除定义在表上的各种约束,可以通过企业管理器或者利用系统函数实现。(1)利用“企业管理器”删除约束(2)利用系统函数drop删除约束 对于具有名称的完整性约束,利用系统函数drop也可以方便地实现约束的删除。其具体的命令如下: ALTER TABLE table_name DROP CONSTRAINT constraint_name
其中: table_name:需要删除约束的表的名称 constraint_name:需要删除的约束的名称
[例题40] 使用系统函数删除表teachers上定义的DF_status约束。具体命令如下: use tsinghua ALTER TABLE teachers DROP CONSTRAINT DF_status go
用户不可以通过系统存储过程对约束的删除进行确认。在查询窗口运行如下命令: EXEC sp_helpconstraint DF_status 返回信息告知: 服务器: 消息 15009,级别 16,状态 1,过程 sp_helpconstraint,行 46 对象 'DF_status' 在数据库 'tsinghua' 中不存在。
27、DEFAULT约束 DEFAULT约束(默认约束)强制了数据的域完整性。通过使用DEFAULT约束可以实现当用户在向数据库表中插入数据时,如果没有明确给出定义有DEFAULT约束列的输入值时,由SQL Server自动为该列输入默认值。定义DEFAULT约束可以在创建表时利用CREATE TABLE命令完成(关于在创建表时定义默认约束)也可以通过向已有表中添加约束实现。向已有表中添加DEFAULT约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name DEFAULT default_value FOR column_name [,...]
其中: table_name:需要增加默认约束的表的名称 constraint_name:需要增加的默认约束的名称 default_value:默认约束的默认值 column_name:表中需要增加默认约束的列的名称
[例题41] 恢复数据库tsinghua中表teachers上的DF_status约束,并在列Title上添加一个输入“未知”值的DEFAULT约束。 具体命令如下: use tsinghua ALTER TABLE teachers ADD CONSTRAINT DF_Status DEFAULT '在职' FOR status, CONSTRAINT DF_Title DEFAULT '未知' FOR title go
在查询分析器窗口中运行上面的命令,在结果窗口中将返回如下运行结果信息:“命令已成功完成”。 用户在使用DEFAULT约束时,还应注意到如下事项: 创建DEFAULT约束时,SQL Server将对表中现有的数据进行数据完整性验证 表中的每一列上只能定义一个DEFAULT约束 DEFAULT约束只在执行INSERT语句时作用
28、CHECK约束 CHECK约束(检查约束)通过限制输入到列中的值来强制数据的域完整性。通过使用CHECK约束可以实现当用户在向数据库表中插入数据或更新数据时,由SQL Server检查新行中的带有CHECK约束的列值使其必须满足约束条件。定义CHECK约束可以在创建表时利用CREATE TABLE命令完成(关于在创建表时定义检查约束用户可以参考上一节的内容),也可以通过向已有表中添加约束实现。向已有表中添加CHECK约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (logical_expression) [,...] 其中: table_name:需要增加检查约束的表的名称 constraint_name:需要增加的检查约束的名称 logical_expression:检查约束的逻辑表达式
[例题42] 在数据库表teachers的列Birthday上添加一个CHECK约束,以保证输入数据大于1900年1月1日并且小于当天的实际日期。 具体命令如下: use tsinghua ALTER TABLE teachers ADD CONSTRAINT CK_Birthday CHECK(Birthday>'01/01/1900' AND Birthday
下面通过向teachers表中插入不符合检查约束CK_Birthday的记录来检查该约束是否已被建立。 在查询分析器中运行如下命令插入新的一行记录: INSERT Departments values(10,'清华大学计算中心') go 执行结果返回信息: 服务器: 消息 213,级别 16,状态 4,行 1 插入错误: 列名或所提供值的数目与表定义不匹配。
在表Departments中插入数据是为了在向表teachers中插入数据时满足外键约束的需要。 INSERT teachers values(41356,'黄轩','男','5/1/1851',20,'教授','62788888','规划部','在职') go 在查询分析器的结果窗口将返回如下信息:
服务器: 消息 547,级别 16,状态 1,行 1 INSERT 语句与 COLUMN CHECK 约束 'CK_Birthday' 冲突。该冲突发生于数据库 'tsinghua',表 'teachers', column 'birthday'。 语句已终止。
从返回信息,可以看出由于新记录在列Birthday上不符合检查约束要求的逻辑条件,造成插入新记录失败,可见CK_Birthday约束已经被子成功建立,用户可以将上面记录的Birthday列的值改为5/1/1951,运行后将返回“命令已成功完成”。 根据CHECK约束是作用在单列还是多列,可以将其分为列级CHECK约束和表级CHECK约束。只作用在单列上的CHECK约束称之为列级CHECK约束,如上面建立的CK约束;作用在表中多列上的CHECK约束称之为表级CHECK约束,例如图书馆数据库中的借书记录表中,要求所有被借书归还日期必须大于借出日期,由于该CHECK约束涉及到表中的两列,所以属于表级约束。CHECK约束在执行INSERT语句或UPDATE语句时作用。
29、PRIMARY KEY约束 表中经常有一个列或列的组合,其值能惟一地标识表中的每一行。这样的一列或多列称为表的主键(Primary Key),通过它可强制表的实体完整性。一个表只能有一个PRIMARY KEY约束,而且PRIMARY KEY约束中的列不能接受空值。由于PRIMARY KEY约束能够确保数据的惟一性,所以经常用来定义标识列。当为表指定PRIMARY KEY约束时,SQL Server通过为主键列创建惟一索引强制数据的惟一性。当在查询中使用主键时,该索引还可用来对数据进行快速访问。如果PRIMARY KEY约束定义在不止一列上,则一列中的值可以重复,但PRIMARY KEY约束定义中的所有列的组合的值必须惟一。 定义PRIMARY KEY约束可以创建表时利用CREATE TABLE命令完成(关于在创建表时定义检查约束用户可以参考上一节的内容),也可以通过向已有表中添加约束实现。向已有表中添加PRIMARY KEY约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY [CLUSTERED|NONCLUSTERED]{(column_name[,...])} 其中各参数的意义如下: table_name:需要增加PRIMARY KEY约束的表的名称 constraint_name:需要增加的PRIMARY KEY约束的名称 CLUSTERED|NONCLUSTERED:指定在PRIMARY KEY约束所在列创建聚集索引(CLUSTERED)还是非聚集索引(NONCLUSTERED)。在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同,每张表只能包含一个聚集索引。在非聚集索引中,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引有更快的数据访问速度。 column_name:需要建立PRIMARY KEY约束的所在列的列名
下面举例说明如何在表中的多列上建立复合的PRIMARY KEY约束。
[例题43] 在数据库tsinghua中新建表Subjects以记录学校所有学科的数据。表中包括的学科信息分别为:一级学科代码、一级学科名称、二级学科代码、二级学科名称。在创建完后,向字段一级学科代码和二级学科代码上追加PRIMARY KEY约束。 具体命令如下: use tsinghua go CREATE TABLE tsinghua.dbo.Subjects ( PrimaryCode tinyint NOT NULL, PrimaryName nvarchar(20) NULL, SecondaryCode tinyint NOT NULL, SecondaryName nvarchar(20) NULL ) go ALTER TABLE Subjects ADD CONSTRAINT PK_Subjects PRIMARY KEY CLUSTERED (PrimaryCode,SecondaryCode) go
30、UNIQUE约束 UNIQUE约束(惟一约束)强制了数据的实体完整性。通过使用UNIQUE约束可以确保在非主键列中不输入重复值。在已经定义有PRIMARY KEY约束的表中,通过使用UNIQUE约束可以带来方便。与PRIMARY KEY约束相比,UNIQUE约束可以实现在一张表上定义多个UNIQUE约束,并且在定义有UNIQUE约束的列上允许有一个空值。此外用户也可以向PRIMARY KEY一样在单一指定列和多个指定列上创建惟一UNIQUE索引。 定义UNIQUE约束可以在创建表时利用CREATE TABLE命令完成,也可以通过向已有表中添加约束实现。向已有表中添加UNIQUE约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE [CLUSTERED|NONCLUSTERED]{(column_name[,...])}
其中: table_name:需要增加惟一约束的表的名称 constraint_name:需要增加的惟一约束的名称 column_name:表中需要增加惟一约束的单个或多个列的名称
[例题44] 在数据库中,在表上的列上添加一个UNIQUE约束。 具体命令如下: use tsinghua ALTER TABLE Departments ADD CONSTRAINT U_TelCode UNIQUE (TelCode) go 31、FOREIGN KEY约束 FOREIGN KEY(外键)是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加另一个表中,可创建两个表之间的链接,这个列就成为第二个表的外键。使用FOREIGN KEY约束能够强制引用完整性。被FOREIGN KEY参照的列在表中应该具有PRIMARY KEY约束或UNIQUE约束。 定义FOREIGN KEY约束可以在创建表时利用CREATE TABLE命令完成,也可以通过向已有表中添加约束实现。向已有表中添加FOREIGN KEY约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY {(column_name[,...])} REFERENCES ref_table{(column_name[,...])} [ON DELETE {CASCADE|NO ACTION}] [ON UPDATE {CASCADE|NO ACTION}]
其中: table_name:需用增加FOREIGN KEY约束的表的名称 constraint_name:需要增加的FOREIGN KEY约束的名称 ref_table:被FOREIGN KEY约束参照的表的名称 column_name:需要建立FOREIGN KEY约束的所在列的列名或被参照的列的列名
注意REFERENCES子句后的ON DELETE子句和ON UPDATE子句,在这些子句中执行CASCADE和NO ACTION选项。之所以设置这两个子句是因为考虑到当被FOREIGN KEY约束参考的列值发生改变时,是应将该改变自动传播到定义有FOREIGN KEY约束的列,还是自动产生错误并回滚该改变,所以把这两个选项称为级联参考选项。如果没有指定ON DELETE或ON UPDATE,则默认为NO ACTION,NO ACTION指定的行为与SQL Server的早期版本中发生的行为相同。下面介绍各选项进行组合的含义: (1)ON DELETE NO ACTION 指定如果试图删除某行,而该行含有由其他表的现有行中的外键所引用的键,则产生错误并回滚DELETE。 (2)ON UPDATE NO ACTION 指定如果试图更新某行中的键值,而该行含有由其他表的现有行中的外键所引用的键,则产生错误并回滚UPDATE。CASCADE允许在表间级联键值的删除或更新操作,这些表的外键关系可追溯到执行修改的表。不能为任何具有timestamp列的外键和主键指定CASCADE。 (3)ON DELETE CASCADE 指定如果试图删除某行,而该行含有由其他表的现有行中的外键所引用的键,则也将删除所有包含那些外键的行。如果在目标表上也定义了级联引用操作,则对从那些表中删除的行同样采取指定的级联操作。 (4)ON UPDATE CASCADE 指定如果试图更新某行中的键值,而该行的键值由其他表的现有行中的外键所引用,则所有外键值也将更新成为该键指定的新值。如果在目标表上也定义了级联引用操作,则对在那些表中更新的键值同样采取指定的级联操作。 关于FOREIGN KEY约束的级联参考选项的使用,用户可以参考数据库Northwind中Products表上定义的FK_Products_Suppliers 约束。该约束建立了从Products表中的SupplierID列到Suppliers表中定义有PRIMARY KEY约束的SupplierID列的外键关系。用户如果为该约束指定了ON DELETE CASCADE选项,则删除Suppliers表中SupplierID=1的行时,也将删除SupplierID=1的Products表中的三行;如果为该约束指定了ON DELETE NO ACTION选项,则删除Suppliers表中SupplierID=1的行时将产生错误信息,并回滚DELETE操作;如果为该约束指定了ON UPDATE CASCADE选项,则更新Suppliers表中从1到55的SupplierID值也将更新Products表中SupplierID值当前等于1的三行的SupplierID值;如果为该约束指定了ON UPDATE NO ACTION选项,则更新Suppliers表中从1到55的SupplierID值也将更新Products表中SupplierID值当前等于1的三行的SupplierID值。 此外,用户在使用FOREIGN KEY约束时,还应注意到如下事项: 1、在FOREIGN KEY语句中指定的列数和数据类型必须和在REFERENCES子句中的列数和数据类型相匹配。 2、在同一张表中相互参照时,可以使用没有FOREIGN KEY子句的REFERENCE子句。
32、使用WITH NOCHECK选项 当需要在一个已经存在大量数据的表上定义约束时,SQL Server将自动检验存在数据以证明它们满足约束的要求。此时,用户可以通过使用“WITH NOCHECK”选项来禁止SQL Server对现有数据的约束检查。 并不是所有约束都可以通过设置“WITH NOCHECK”选项禁止纸检查。能禁止约束检查的只有CHECK和FOREIGN KEY约束。值得注意的是,在使用“WITH NOCHECK”时用户应该确信对现有数据禁止约束检查是合理的。使用“WITH NOCHECK”选项的命令如下: ALTER TABLE table_name WITH NOCHECK ADD CONSTRAINT constraint_name [CHECK(logical_expression)] [FOREIGN KEY (column_name[,...]) REFERENCES reftable_name (refcol_name[,...])] 其中各参数的意义与前面的参数意义都一样。
[例题45] 假设数据库tsinghua表Departments中已经存在大量记录,需要在列上添加一个CHECK约束,以保证所有电话号码都以数字6278开头。 具体命令如下: use tsinghua ALTER TABLE Departments WITH NOCHECK ADD CONSTRAINT CK_Dept_TelCode CHECK(TelCode LIKE '6278[0-9][0-9][0-9][0-9]') go
33、使用NOCHECK选项 当需要向在一张定义有约束的表中插入新记录或修改记录时,SQL Server将自动检验新数据以确定它们满足表上约束的要求。此时,可以通过使用“NOCHECK”选项来禁止SQL Server对新数据的约束检查。 并不是所有约束都可以通过设置“NOCHECK”选项来禁止SQL Server检查新数据。能禁止亲数据检查的也只有CHECK和FOREIGN KEY约束。值得注意的是在使用“NOCHECK”时,用户应该确信插入的新记录或修改后的新记录符合表中现有约束。用户在给约束设置“NOCHECK”选项后,可以通过给约束再次设置“CHECK”选项使得SQL Server恢复对载入数据的约束检查。使用“NOCHECK”选项的命令如下: ALTER TABLE table_name [CHECK|NOCHECK] CONSTRAINT {ALL|constraint_name[,...]} 其中各参数的意义与前面的参数意义都一样。
[例题46] 设置数据库表teachers中约束FK_DeptCode的NOCHECK选项,使用SQL Server对即将插入的大量数据不做FK_DeptCode的约束检查。 具体命令如下: use tsinghua ALTER TABLE teachers NOCHECK CONSTRAINT FK_DeptCode go 34、使用默认 声明数据完整性可以使用约束、默认和规则实现。 与在约束中介绍的DEFAULT约束一样,使用默认也可以实现当用户在向数据库表中插入一行数据时,如果没有明确给出某列的输入值时,则由SQL Server自动为该列输入默认值。但与DEFAULT约束不同的是,默认是一种数据库对象,在数据库中只需定义一次后,就可以被一次或多次应用于任意表中的一列或多列,还可以用于用户定义的数据类型。 创建默认的命令如下: CREATE DEFAULT default_name AS constant_expression
其中: default_name:新建立的默认的名称,应遵从SQL Server的命令规则 constant_expression:指定默认的常数值
在默认被创建后,用户必须通过执行系统存储过程sp_bindefault将其定于列或用户自定义的数据类型上,从而将默认用于数据库中任意表的一列或多列,以及用于用户自定义的数据类型,执行默认绑定的命令如下: EXEC sp_bindefault default_name 'table_name.[column_name[,...]|user_datetype]' [例题47] 在数据库tsinghua上创建默认DeptCode_default,并将其绑定在数据库表Departments中的DeptCode列上,从而实现各系默认电话为62780001(校总机)。 具体命令如下: use tsinghua go CREATE DEFAULT DeptCode_default AS '62780001' go EXEC sp_bindefault DeptCode_default,'Departments.DeptCode' go
返回信息: 已将默认值绑定到列。
用户也可以通过执行系统存储过程sp_unbindefault的命令来达到同样的操作,实现该功能的语法如下: EXEC sp_unbindefault default_name 'table_name.[column_name[,...]|user_datetype]' 如果用户需要删除数据库中定义的默认,可以通过“企业管理器”或使用DROP DEFAULT语句实现。使用“企业管理器”时, 用户只需选中需要删除的默认,按鼠标右键,从弹出的菜单中选择“删除”即可完成工作,使用DROP DEFAULT删除默认时,命令语法如下: DROP DEFAULT default_name[,...]
其中,default_name为需要删除的默认的名称。 使用默认时,用户还应注意到如下事项: 1、绑定在列上的默认必须符合该列的数据类型和列上存在的CHECK约束 2、不能在用户自定义的数据类型所在列创建默认
35、使用规则 通过使用规则,用户要可以指定插入数据库表上列中的有效值,从而确保数据在指定的取值范围内,并与特定的模式或特定数据库表中实体匹配。规则也是一种数据库对象。因此和默认一样在数据库中只需定义一次,就可以被一次或多次应用于任意表中的一列或多列,也可以用于用户定义的数据类型。 创建默认的命令如下: CREATE RULE rule_name AS condition_expression 其中: rule_name:新建立的规则的名称应遵从SQL Server的命名规则 condition_expression:是定义规则的条件。规则可以是WHERE子句中有任何有效的表达式,并且可以包含诸如算术运算符、关系运算符和谓词(如IN、LIKE、BETWEEN)之类的元素。规则不能引用列或其他数据库对象。可以包含不引用数据库对象的内置函数。condition expression包含一个变量。每个局部变量的前面都有一个@符号。该表达式引用通过UPDATE 或者 INSERT语句输入的值。 在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是@符号,在规则被创建后,用户必须通过执行系统存储过程sp_bindrule将其绑定于列或用户自定义的数据类型上,从而将规则用于数据库中任意表的一列或多列,以及用于用户自定义的数据类型,执行规则绑定的命令如下: EXEC sp_bindrule rule_name, 'table_name.[column_name[,...]|user_datetype]'
[例题48] 在数据库tsinghua上创建规则Code_rule,并将其绑定在数据库表stud_info中的stud_id列上,从而使学生标识号stud_id为1到50的自然数(包含1到50)。具体命令如下: use tsinghua go CREATE RULE Code_rule AS @stud_id>=1 AND @stud_id<=50 go EXEC sp_bindrule Code_rule,'stud_info.stud_id' go 在表中的某列上绑定了规则后,如果用户想从该列上删除规则只需执行系统存储过程sp_unbindrule。 执行系统存储过程sp_unbindrule的命令语法如下: EXEC sp_unbindrule rule_name, 'table_name.[column_name[,...]|user_datetype]'
使用DROP RULE语句删除规则时,命令语法如下: DROP RULE rule_name[,...]
其中,rule_name为需要删除的规则的名称。 使用规则时,用户还应注意到如下事项: 1、默认情况下,SQL Server将对在创建和绑定规则之前数据库表中存在的数据进行检查。 2、在一个列上至多有一个规则起作用,如果有多个规则与一列相绑定,那么只有最后绑定到该列的规则有效。
表: 数据完整性方法、功能及效果实现方法 实现效果 实现功能 性能开销约束 定义表有效的数据,在事务处理前执行,有较好的性能 中等 低默认和规则 提供独立的可以与多个表联系的对象实现数据完整性,在事务处理前执行 低 低数据类型,空/非空约束 提供最低级别的数据完整性,在表创建时实现,在事务处理开始前执行 低 低
此外,就声明数据完整性与过程定义完整性的选择,应当遵循以下两点:1、对于基础的完整性逻辑,应该采用声明数据完整性2、如果要维护复杂而全面的完整性逻辑,应该采用过程定义数据完整性
24、约束的创建 约束可以通过使用CREATE TABLE命令创建。 具体语法如下: CREATE TABLE table_name (column_name data_type (NULL | NOT NULL)[[CONSTRAINT constraint_name]{PRIMARY KEY [CLUSTERED | NONCLUSTERED] | UNIQUE [CLUSTERED | NONCLUSTERED] | [FOREIGN KEY] REFERENCES ref_table [(ref_column)] | DEFAULT constant_expression | CHECK(logical_expression)}][,...]) 其中,各参数的意义为: table_name:创建约束的表名称 column_name:创建约束的列的名称 data_type:所在列的数据类型 constraint_name:新建约束的名称
[例题37] 在tsinghua数据库中创建一张用于教师信息管理的表teachers,表中包括的教师信息分别为:教师编号、教师姓名、性别、出身年月、所在系代号、职称、办公室电话号码、科研方向以及工作状态,在创建时定义有列约束和表约束。 具体命令如下: use tsinghua CREATE TABLE tsinghua.dbo.teachers (TeacherID int NOT NULL, name nvarchar(5) NOT NULL, gender nchar(1) NULL, birthday datetime NULL, DeptCode tinyint NOT NULL, Title nvarchar(5) NULL, TelCode char(8) NOT NULL, aspect nvarchar(200) NULL, status nvarchar(5) NOT NULL CONSTRAINT DF_Status DEFAULT('在职'), CONSTRAINT PK_Teacher PRIMARY KEY CLUSTERED(TeacherID), CONSTRAINT FK_DeptCode FOREIGN KEY (DeptCode) REFERENCES dbo.departments(DeptCode), CONSTRAINT CK_TelCode CHECK(TelCode LIKE '627[0-9][0-9][0-9][0-9][0-9]'),) go 在这个例子中,用户可以看到我们使用的约束类型依次为非空约束、默认约束、主键约束、外键约束和检查约束。 在结果显示窗口中可以看到错误提示:
服务器: 消息 1767,级别 16,状态 1,行 2 外键 'FK_DeptCode' 引用了无效的表 'dbo.departments'。 服务器: 消息 1750,级别 16,状态 1,行 2 未能创建约束。请参阅前面的错误信息。
这是由于还没有在数据库tsinghua中创建外键约束FK_DeptCode所需表departments,用户可以通过下面指令先创建表departments: CREATE TABLE tsinghua.dbo.departments (DeptCode tinyint NOT NULL Primary Key, DeptName nchar(20) NOT NULL, TelCode char(8) NULL) go
25、查看约束的定义信息 在CREATE TABLE语句中使用CONSTRAINT定义完整约束时,其约束命名必须在数据库中保持惟一,此外还应遵从SQL Server的标志符规则。 约束在创建后SQL Server将指导约束的名称保存在系统表sysobjects中,并把创建的文本代码保存在系统表syscomments中。SQL Server为用户提供了多种查看约束信息的方法。(1)使用系统存储过程 用户可以通过使用系统存储过程sp_help,sp_helptext,sp_helpconstraint来查看约束的相关信息。 具体命令的语法如下: EXEC sp_help (sp_helptext,sp_helpconstraint) 其中:sonstraint_name为需要查看的约束的名称。
[例题38] 使用系统存储过程sp_helptext查看表teachers上约束CK_TelCode的定义文本信息。 具体命令如下: use tsinghua EXEC sp_helptext CK_TelCode go(2)使用规划视图 用户还可以通过查询系统规划视图check_constraints,referential_constraints,table_constraints得到约束的相关信息。
[例题39] 使用系统规划视图check_constraints查看数据库tsinghua上存在的所有约束的相关信息。 具体命令如下: use pubs SELECT * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS go (3)使用“企业管理器”
26、删除约束 要删除定义在表上的各种约束,可以通过企业管理器或者利用系统函数实现。(1)利用“企业管理器”删除约束(2)利用系统函数drop删除约束 对于具有名称的完整性约束,利用系统函数drop也可以方便地实现约束的删除。其具体的命令如下: ALTER TABLE table_name DROP CONSTRAINT constraint_name
其中: table_name:需要删除约束的表的名称 constraint_name:需要删除的约束的名称
[例题40] 使用系统函数删除表teachers上定义的DF_status约束。具体命令如下: use tsinghua ALTER TABLE teachers DROP CONSTRAINT DF_status go
用户不可以通过系统存储过程对约束的删除进行确认。在查询窗口运行如下命令: EXEC sp_helpconstraint DF_status 返回信息告知: 服务器: 消息 15009,级别 16,状态 1,过程 sp_helpconstraint,行 46 对象 'DF_status' 在数据库 'tsinghua' 中不存在。
27、DEFAULT约束 DEFAULT约束(默认约束)强制了数据的域完整性。通过使用DEFAULT约束可以实现当用户在向数据库表中插入数据时,如果没有明确给出定义有DEFAULT约束列的输入值时,由SQL Server自动为该列输入默认值。定义DEFAULT约束可以在创建表时利用CREATE TABLE命令完成(关于在创建表时定义默认约束)也可以通过向已有表中添加约束实现。向已有表中添加DEFAULT约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name DEFAULT default_value FOR column_name [,...]
其中: table_name:需要增加默认约束的表的名称 constraint_name:需要增加的默认约束的名称 default_value:默认约束的默认值 column_name:表中需要增加默认约束的列的名称
[例题41] 恢复数据库tsinghua中表teachers上的DF_status约束,并在列Title上添加一个输入“未知”值的DEFAULT约束。 具体命令如下: use tsinghua ALTER TABLE teachers ADD CONSTRAINT DF_Status DEFAULT '在职' FOR status, CONSTRAINT DF_Title DEFAULT '未知' FOR title go
在查询分析器窗口中运行上面的命令,在结果窗口中将返回如下运行结果信息:“命令已成功完成”。 用户在使用DEFAULT约束时,还应注意到如下事项: 创建DEFAULT约束时,SQL Server将对表中现有的数据进行数据完整性验证 表中的每一列上只能定义一个DEFAULT约束 DEFAULT约束只在执行INSERT语句时作用
28、CHECK约束 CHECK约束(检查约束)通过限制输入到列中的值来强制数据的域完整性。通过使用CHECK约束可以实现当用户在向数据库表中插入数据或更新数据时,由SQL Server检查新行中的带有CHECK约束的列值使其必须满足约束条件。定义CHECK约束可以在创建表时利用CREATE TABLE命令完成(关于在创建表时定义检查约束用户可以参考上一节的内容),也可以通过向已有表中添加约束实现。向已有表中添加CHECK约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (logical_expression) [,...] 其中: table_name:需要增加检查约束的表的名称 constraint_name:需要增加的检查约束的名称 logical_expression:检查约束的逻辑表达式
[例题42] 在数据库表teachers的列Birthday上添加一个CHECK约束,以保证输入数据大于1900年1月1日并且小于当天的实际日期。 具体命令如下: use tsinghua ALTER TABLE teachers ADD CONSTRAINT CK_Birthday CHECK(Birthday>'01/01/1900' AND Birthday
下面通过向teachers表中插入不符合检查约束CK_Birthday的记录来检查该约束是否已被建立。 在查询分析器中运行如下命令插入新的一行记录: INSERT Departments values(10,'清华大学计算中心') go 执行结果返回信息: 服务器: 消息 213,级别 16,状态 4,行 1 插入错误: 列名或所提供值的数目与表定义不匹配。
在表Departments中插入数据是为了在向表teachers中插入数据时满足外键约束的需要。 INSERT teachers values(41356,'黄轩','男','5/1/1851',20,'教授','62788888','规划部','在职') go 在查询分析器的结果窗口将返回如下信息:
服务器: 消息 547,级别 16,状态 1,行 1 INSERT 语句与 COLUMN CHECK 约束 'CK_Birthday' 冲突。该冲突发生于数据库 'tsinghua',表 'teachers', column 'birthday'。 语句已终止。
从返回信息,可以看出由于新记录在列Birthday上不符合检查约束要求的逻辑条件,造成插入新记录失败,可见CK_Birthday约束已经被子成功建立,用户可以将上面记录的Birthday列的值改为5/1/1951,运行后将返回“命令已成功完成”。 根据CHECK约束是作用在单列还是多列,可以将其分为列级CHECK约束和表级CHECK约束。只作用在单列上的CHECK约束称之为列级CHECK约束,如上面建立的CK约束;作用在表中多列上的CHECK约束称之为表级CHECK约束,例如图书馆数据库中的借书记录表中,要求所有被借书归还日期必须大于借出日期,由于该CHECK约束涉及到表中的两列,所以属于表级约束。CHECK约束在执行INSERT语句或UPDATE语句时作用。
29、PRIMARY KEY约束 表中经常有一个列或列的组合,其值能惟一地标识表中的每一行。这样的一列或多列称为表的主键(Primary Key),通过它可强制表的实体完整性。一个表只能有一个PRIMARY KEY约束,而且PRIMARY KEY约束中的列不能接受空值。由于PRIMARY KEY约束能够确保数据的惟一性,所以经常用来定义标识列。当为表指定PRIMARY KEY约束时,SQL Server通过为主键列创建惟一索引强制数据的惟一性。当在查询中使用主键时,该索引还可用来对数据进行快速访问。如果PRIMARY KEY约束定义在不止一列上,则一列中的值可以重复,但PRIMARY KEY约束定义中的所有列的组合的值必须惟一。 定义PRIMARY KEY约束可以创建表时利用CREATE TABLE命令完成(关于在创建表时定义检查约束用户可以参考上一节的内容),也可以通过向已有表中添加约束实现。向已有表中添加PRIMARY KEY约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY [CLUSTERED|NONCLUSTERED]{(column_name[,...])} 其中各参数的意义如下: table_name:需要增加PRIMARY KEY约束的表的名称 constraint_name:需要增加的PRIMARY KEY约束的名称 CLUSTERED|NONCLUSTERED:指定在PRIMARY KEY约束所在列创建聚集索引(CLUSTERED)还是非聚集索引(NONCLUSTERED)。在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同,每张表只能包含一个聚集索引。在非聚集索引中,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引有更快的数据访问速度。 column_name:需要建立PRIMARY KEY约束的所在列的列名
下面举例说明如何在表中的多列上建立复合的PRIMARY KEY约束。
[例题43] 在数据库tsinghua中新建表Subjects以记录学校所有学科的数据。表中包括的学科信息分别为:一级学科代码、一级学科名称、二级学科代码、二级学科名称。在创建完后,向字段一级学科代码和二级学科代码上追加PRIMARY KEY约束。 具体命令如下: use tsinghua go CREATE TABLE tsinghua.dbo.Subjects ( PrimaryCode tinyint NOT NULL, PrimaryName nvarchar(20) NULL, SecondaryCode tinyint NOT NULL, SecondaryName nvarchar(20) NULL ) go ALTER TABLE Subjects ADD CONSTRAINT PK_Subjects PRIMARY KEY CLUSTERED (PrimaryCode,SecondaryCode) go
30、UNIQUE约束 UNIQUE约束(惟一约束)强制了数据的实体完整性。通过使用UNIQUE约束可以确保在非主键列中不输入重复值。在已经定义有PRIMARY KEY约束的表中,通过使用UNIQUE约束可以带来方便。与PRIMARY KEY约束相比,UNIQUE约束可以实现在一张表上定义多个UNIQUE约束,并且在定义有UNIQUE约束的列上允许有一个空值。此外用户也可以向PRIMARY KEY一样在单一指定列和多个指定列上创建惟一UNIQUE索引。 定义UNIQUE约束可以在创建表时利用CREATE TABLE命令完成,也可以通过向已有表中添加约束实现。向已有表中添加UNIQUE约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE [CLUSTERED|NONCLUSTERED]{(column_name[,...])}
其中: table_name:需要增加惟一约束的表的名称 constraint_name:需要增加的惟一约束的名称 column_name:表中需要增加惟一约束的单个或多个列的名称
[例题44] 在数据库中,在表上的列上添加一个UNIQUE约束。 具体命令如下: use tsinghua ALTER TABLE Departments ADD CONSTRAINT U_TelCode UNIQUE (TelCode) go 31、FOREIGN KEY约束 FOREIGN KEY(外键)是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加另一个表中,可创建两个表之间的链接,这个列就成为第二个表的外键。使用FOREIGN KEY约束能够强制引用完整性。被FOREIGN KEY参照的列在表中应该具有PRIMARY KEY约束或UNIQUE约束。 定义FOREIGN KEY约束可以在创建表时利用CREATE TABLE命令完成,也可以通过向已有表中添加约束实现。向已有表中添加FOREIGN KEY约束的语法为: ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY {(column_name[,...])} REFERENCES ref_table{(column_name[,...])} [ON DELETE {CASCADE|NO ACTION}] [ON UPDATE {CASCADE|NO ACTION}]
其中: table_name:需用增加FOREIGN KEY约束的表的名称 constraint_name:需要增加的FOREIGN KEY约束的名称 ref_table:被FOREIGN KEY约束参照的表的名称 column_name:需要建立FOREIGN KEY约束的所在列的列名或被参照的列的列名
注意REFERENCES子句后的ON DELETE子句和ON UPDATE子句,在这些子句中执行CASCADE和NO ACTION选项。之所以设置这两个子句是因为考虑到当被FOREIGN KEY约束参考的列值发生改变时,是应将该改变自动传播到定义有FOREIGN KEY约束的列,还是自动产生错误并回滚该改变,所以把这两个选项称为级联参考选项。如果没有指定ON DELETE或ON UPDATE,则默认为NO ACTION,NO ACTION指定的行为与SQL Server的早期版本中发生的行为相同。下面介绍各选项进行组合的含义: (1)ON DELETE NO ACTION 指定如果试图删除某行,而该行含有由其他表的现有行中的外键所引用的键,则产生错误并回滚DELETE。 (2)ON UPDATE NO ACTION 指定如果试图更新某行中的键值,而该行含有由其他表的现有行中的外键所引用的键,则产生错误并回滚UPDATE。CASCADE允许在表间级联键值的删除或更新操作,这些表的外键关系可追溯到执行修改的表。不能为任何具有timestamp列的外键和主键指定CASCADE。 (3)ON DELETE CASCADE 指定如果试图删除某行,而该行含有由其他表的现有行中的外键所引用的键,则也将删除所有包含那些外键的行。如果在目标表上也定义了级联引用操作,则对从那些表中删除的行同样采取指定的级联操作。 (4)ON UPDATE CASCADE 指定如果试图更新某行中的键值,而该行的键值由其他表的现有行中的外键所引用,则所有外键值也将更新成为该键指定的新值。如果在目标表上也定义了级联引用操作,则对在那些表中更新的键值同样采取指定的级联操作。 关于FOREIGN KEY约束的级联参考选项的使用,用户可以参考数据库Northwind中Products表上定义的FK_Products_Suppliers 约束。该约束建立了从Products表中的SupplierID列到Suppliers表中定义有PRIMARY KEY约束的SupplierID列的外键关系。用户如果为该约束指定了ON DELETE CASCADE选项,则删除Suppliers表中SupplierID=1的行时,也将删除SupplierID=1的Products表中的三行;如果为该约束指定了ON DELETE NO ACTION选项,则删除Suppliers表中SupplierID=1的行时将产生错误信息,并回滚DELETE操作;如果为该约束指定了ON UPDATE CASCADE选项,则更新Suppliers表中从1到55的SupplierID值也将更新Products表中SupplierID值当前等于1的三行的SupplierID值;如果为该约束指定了ON UPDATE NO ACTION选项,则更新Suppliers表中从1到55的SupplierID值也将更新Products表中SupplierID值当前等于1的三行的SupplierID值。 此外,用户在使用FOREIGN KEY约束时,还应注意到如下事项: 1、在FOREIGN KEY语句中指定的列数和数据类型必须和在REFERENCES子句中的列数和数据类型相匹配。 2、在同一张表中相互参照时,可以使用没有FOREIGN KEY子句的REFERENCE子句。
32、使用WITH NOCHECK选项 当需要在一个已经存在大量数据的表上定义约束时,SQL Server将自动检验存在数据以证明它们满足约束的要求。此时,用户可以通过使用“WITH NOCHECK”选项来禁止SQL Server对现有数据的约束检查。 并不是所有约束都可以通过设置“WITH NOCHECK”选项禁止纸检查。能禁止约束检查的只有CHECK和FOREIGN KEY约束。值得注意的是,在使用“WITH NOCHECK”时用户应该确信对现有数据禁止约束检查是合理的。使用“WITH NOCHECK”选项的命令如下: ALTER TABLE table_name WITH NOCHECK ADD CONSTRAINT constraint_name [CHECK(logical_expression)] [FOREIGN KEY (column_name[,...]) REFERENCES reftable_name (refcol_name[,...])] 其中各参数的意义与前面的参数意义都一样。
[例题45] 假设数据库tsinghua表Departments中已经存在大量记录,需要在列上添加一个CHECK约束,以保证所有电话号码都以数字6278开头。 具体命令如下: use tsinghua ALTER TABLE Departments WITH NOCHECK ADD CONSTRAINT CK_Dept_TelCode CHECK(TelCode LIKE '6278[0-9][0-9][0-9][0-9]') go
33、使用NOCHECK选项 当需要向在一张定义有约束的表中插入新记录或修改记录时,SQL Server将自动检验新数据以确定它们满足表上约束的要求。此时,可以通过使用“NOCHECK”选项来禁止SQL Server对新数据的约束检查。 并不是所有约束都可以通过设置“NOCHECK”选项来禁止SQL Server检查新数据。能禁止亲数据检查的也只有CHECK和FOREIGN KEY约束。值得注意的是在使用“NOCHECK”时,用户应该确信插入的新记录或修改后的新记录符合表中现有约束。用户在给约束设置“NOCHECK”选项后,可以通过给约束再次设置“CHECK”选项使得SQL Server恢复对载入数据的约束检查。使用“NOCHECK”选项的命令如下: ALTER TABLE table_name [CHECK|NOCHECK] CONSTRAINT {ALL|constraint_name[,...]} 其中各参数的意义与前面的参数意义都一样。
[例题46] 设置数据库表teachers中约束FK_DeptCode的NOCHECK选项,使用SQL Server对即将插入的大量数据不做FK_DeptCode的约束检查。 具体命令如下: use tsinghua ALTER TABLE teachers NOCHECK CONSTRAINT FK_DeptCode go 34、使用默认 声明数据完整性可以使用约束、默认和规则实现。 与在约束中介绍的DEFAULT约束一样,使用默认也可以实现当用户在向数据库表中插入一行数据时,如果没有明确给出某列的输入值时,则由SQL Server自动为该列输入默认值。但与DEFAULT约束不同的是,默认是一种数据库对象,在数据库中只需定义一次后,就可以被一次或多次应用于任意表中的一列或多列,还可以用于用户定义的数据类型。 创建默认的命令如下: CREATE DEFAULT default_name AS constant_expression
其中: default_name:新建立的默认的名称,应遵从SQL Server的命令规则 constant_expression:指定默认的常数值
在默认被创建后,用户必须通过执行系统存储过程sp_bindefault将其定于列或用户自定义的数据类型上,从而将默认用于数据库中任意表的一列或多列,以及用于用户自定义的数据类型,执行默认绑定的命令如下: EXEC sp_bindefault default_name 'table_name.[column_name[,...]|user_datetype]' [例题47] 在数据库tsinghua上创建默认DeptCode_default,并将其绑定在数据库表Departments中的DeptCode列上,从而实现各系默认电话为62780001(校总机)。 具体命令如下: use tsinghua go CREATE DEFAULT DeptCode_default AS '62780001' go EXEC sp_bindefault DeptCode_default,'Departments.DeptCode' go
返回信息: 已将默认值绑定到列。
用户也可以通过执行系统存储过程sp_unbindefault的命令来达到同样的操作,实现该功能的语法如下: EXEC sp_unbindefault default_name 'table_name.[column_name[,...]|user_datetype]' 如果用户需要删除数据库中定义的默认,可以通过“企业管理器”或使用DROP DEFAULT语句实现。使用“企业管理器”时, 用户只需选中需要删除的默认,按鼠标右键,从弹出的菜单中选择“删除”即可完成工作,使用DROP DEFAULT删除默认时,命令语法如下: DROP DEFAULT default_name[,...]
其中,default_name为需要删除的默认的名称。 使用默认时,用户还应注意到如下事项: 1、绑定在列上的默认必须符合该列的数据类型和列上存在的CHECK约束 2、不能在用户自定义的数据类型所在列创建默认
35、使用规则 通过使用规则,用户要可以指定插入数据库表上列中的有效值,从而确保数据在指定的取值范围内,并与特定的模式或特定数据库表中实体匹配。规则也是一种数据库对象。因此和默认一样在数据库中只需定义一次,就可以被一次或多次应用于任意表中的一列或多列,也可以用于用户定义的数据类型。 创建默认的命令如下: CREATE RULE rule_name AS condition_expression 其中: rule_name:新建立的规则的名称应遵从SQL Server的命名规则 condition_expression:是定义规则的条件。规则可以是WHERE子句中有任何有效的表达式,并且可以包含诸如算术运算符、关系运算符和谓词(如IN、LIKE、BETWEEN)之类的元素。规则不能引用列或其他数据库对象。可以包含不引用数据库对象的内置函数。condition expression包含一个变量。每个局部变量的前面都有一个@符号。该表达式引用通过UPDATE 或者 INSERT语句输入的值。 在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是@符号,在规则被创建后,用户必须通过执行系统存储过程sp_bindrule将其绑定于列或用户自定义的数据类型上,从而将规则用于数据库中任意表的一列或多列,以及用于用户自定义的数据类型,执行规则绑定的命令如下: EXEC sp_bindrule rule_name, 'table_name.[column_name[,...]|user_datetype]'
[例题48] 在数据库tsinghua上创建规则Code_rule,并将其绑定在数据库表stud_info中的stud_id列上,从而使学生标识号stud_id为1到50的自然数(包含1到50)。具体命令如下: use tsinghua go CREATE RULE Code_rule AS @stud_id>=1 AND @stud_id<=50 go EXEC sp_bindrule Code_rule,'stud_info.stud_id' go 在表中的某列上绑定了规则后,如果用户想从该列上删除规则只需执行系统存储过程sp_unbindrule。 执行系统存储过程sp_unbindrule的命令语法如下: EXEC sp_unbindrule rule_name, 'table_name.[column_name[,...]|user_datetype]'
使用DROP RULE语句删除规则时,命令语法如下: DROP RULE rule_name[,...]
其中,rule_name为需要删除的规则的名称。 使用规则时,用户还应注意到如下事项: 1、默认情况下,SQL Server将对在创建和绑定规则之前数据库表中存在的数据进行检查。 2、在一个列上至多有一个规则起作用,如果有多个规则与一列相绑定,那么只有最后绑定到该列的规则有效。
表: 数据完整性方法、功能及效果实现方法 实现效果 实现功能 性能开销约束 定义表有效的数据,在事务处理前执行,有较好的性能 中等 低默认和规则 提供独立的可以与多个表联系的对象实现数据完整性,在事务处理前执行 低 低数据类型,空/非空约束 提供最低级别的数据完整性,在表创建时实现,在事务处理开始前执行 低 低
此外,就声明数据完整性与过程定义完整性的选择,应当遵循以下两点:1、对于基础的完整性逻辑,应该采用声明数据完整性2、如果要维护复杂而全面的完整性逻辑,应该采用过程定义数据完整性
发表评论
-
ORACLE中使用递归查询 (
2012-12-27 16:35 1004在数据库查询中常常会碰到要查询树形结构的数据,需要用一个字段的 ... -
函数与存储过程区别
2011-06-01 18:17 1334本质上没区别。只是 ... -
SQL Server2000安装常见问题
2011-05-25 14:15 1516一:解决安装sql时文件挂起的问题: (1)、点击“开始》运 ... -
MySQL语句优化的原则
2011-04-12 14:21 10161、使用索引来更快 ... -
转SQL-group by学习
2011-04-12 14:18 1289在select 语句中可以使用group by 子句将行划分成 ... -
SQL Select语句完整的执行顺序:
2011-04-12 14:15 1418SQL Select语句完整的执行顺序: 1、from子句组 ... -
SQL截取字符串(substring与patindex的使用)
2011-03-31 13:55 5728SQL截取字符串(substring与patinde ... -
SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL
2011-03-16 09:21 1335先看下面一个嵌套的查 ... -
SQL CHARINDEX (Transact-SQL)
2010-12-06 09:05 1501返回字符串中指定表达式的开始位置。 Transact-SQ ... -
SQL Server基本函数
2010-12-06 08:53 1629SQL Server基本函数 1.字符串函数 : ... -
SQL2005级联删除,层叠,设置空,设置默认值
2010-12-01 15:46 2466浅谈SQL SERVER 2005 之引用 ... -
sql 显示插入主键
2010-10-22 16:28 1328set identity_insert [T_ADMINTYP ... -
取小数
2010-10-22 16:12 1320使用这个方式来计算 SELECT convert(decima ... -
oracle 创建表空间
2010-10-12 11:28 1551一.创建表空间 CREATE SMALLFILE TABLES ... -
sql 约束大全
2010-09-27 16:28 1380--------添加主键约束(bookid作为主键) alt ... -
sql 主外键语法
2010-09-27 08:39 1755alter table dbo.t_commAtta ... -
在SQL Server中,关于with as使用介绍
2010-09-26 13:32 36126一.WITH AS的含义 ... -
procedure 存储过程多个返回测试
2010-09-01 10:26 1204create procedure test(@temp1 va ... -
sql 实现按月份,季度统计报表
2010-08-30 12:01 14997呵呵,我们在处理设计到日期统计时候经常会按照年度,季度,月份统 ... -
SQL Server DATEPART() 不能言
2010-08-30 11:29 1849今天做按月份,按年度,按季度统计报表,后来发现了最简单最可扩展 ...
相关推荐
### SQLServer SQL语法大全 #### 创建数据库 在SQL Server中创建数据库是一项基本操作,通过`CREATE DATABASE`命令来实现。创建数据库时可以指定文件和日志文件的位置、初始大小及增长方式等参数。 **语法示例:**...
### Visual FoxPro中SQL命令语法及示例 #### 1. 准备 - **1.1 创建文档中所要使用到的数据库及环境配置** 在开始学习Visual FoxPro (VFP) 中的SQL命令之前,需要创建一个用于演示的基础数据库环境。以下是创建...
### SQL语句语法详解 #### 数据定义语句 在数据库管理中,数据定义语句(Data Definition Language,DDL)主要用于创建、修改或删除数据库对象,如数据库、表、索引等。 - **ALTER DATABASE语法**:用于修改现有...
本笔记主要针对SQL Server的语法进行整理,旨在帮助初学者快速掌握基础概念和常用操作。 一、SQL简介 SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言。在SQL Server中,你可以创建、更新、...
### SQL基础语法考试必备知识点 #### 一、SQL简介 SQL(Structured Query Language)是一种用于管理关系数据库的标准语言。它提供了强大的数据操作能力,包括数据查询、数据定义、数据操纵和数据控制等功能。 ####...
`NOT NULL`约束表示该列不允许为空值,`PRIMARY KEY`表示该列为表的主键。 - **基于已有表创建新表**: - **语法A**: ```sql CREATE TABLE tab_new LIKE tab_old; ``` - **语法B**: ```sql CREATE TABLE ...
### 达梦数据库常用SQL语句语法 #### 一、新建表 在达梦数据库中创建新表时,可以通过以下语法实现: ```sql CREATE TABLE [表名] ( [自动编号字段] INT IDENTITY(1,1) PRIMARY KEY, [字段1] NVARCHAR(50) ...
本篇将详细解释SQL标准语法及常用语句。 1. 数据操作: - `SELECT`:用于从数据库表中检索数据行和列。你可以选择指定的列,也可以使用通配符`*`来获取所有列。例如,`SELECT * FROM table_name`将返回表中的所有...
### SQL数据库语法基础知识点 #### 一、数据库操作 1. **创建数据库** - 语法:`CREATE DATABASE database-name;` - 功能:创建一个新的数据库实例。 2. **删除数据库** - 语法:`DROP DATABASE dbname;` - ...
为了更好地使用SqlServer,需要掌握一些基本的语法和约束。 一、约束种类 在SqlServer中,约束是一种限制或规则,用于确保数据的正确性和一致性。常见的约束种类有: 1. 默认约束(Default):用于指定列的默认值...
由于文件的内容部分仅提供了PDF编辑器的信息和版权声明,并未直接提供SQL语法的具体范例,因此本文的知识点将会是基于SQL Server和Oracle数据库的通用SQL语法概述和范例的解释。 首先,我们需要了解SQL语言的基本...
以上内容涵盖了SQL Server数据库设计与管理的关键知识点,从数据库的创建到表的操作,再到约束、用户权限、索引、视图和存储过程的管理,全面而深入地介绍了SQL Server的使用技巧与最佳实践。熟练掌握这些技能,对于...
### SQL基础语法详解 #### 一、数据定义语言(Data Definition Language, DDL) 在数据库管理系统中,数据定义语言主要用于创建、修改或删除数据库对象,如表、索引等。以下是一些常用的DDL命令及其解释。 ##### ...
【标题】"ms sql语法学习大全"涉及到的是微软的SQL Server数据库管理系统中的核心语法和操作。SQL Server(简称MS SQL)是广泛应用于企业级数据库管理的重要工具,它提供了丰富的SQL语言来实现数据的存储、查询、...
`lab833-4-2 joindb 中实现数据完整性的各种约束.sql`和`lab833-4-2 joindb 实现constraint(default,rule)约束.sql`这两文件可能专注于数据完整性,这是数据库设计的重要部分,包括实体完整性(如NOT NULL约束)、...
SQL语法大全中文版涵盖了SQL的基础知识和关键操作,以下将详细介绍这些方面: 1. **SQL介绍** SQL是Structured Query Language的缩写,它允许用户对数据库进行查询、更新、插入和删除数据,以及创建和修改数据库...
SQL Server 基础语法 SQL Server 是一种关系数据库管理系统,提供了强大的数据存储和管理功能。 SQL Server 的基础语法包括数据定义、数据操纵和数据控制三个方面。 1. 数据定义功能 数据定义功能是 SQL Server ...
SQL,即Structured Query Language,是用于管理关系数据库的标准...理解并熟练掌握SQL基础和高级语法,将使你在数据库管理和开发中更具效率。无论你是网站开发者还是数据分析员,熟悉SQL都将极大地提升你的工作效率。
在“sql/sql语法基础手册”中,我们可以深入学习SQL的基础知识,包括但不限于以下几个方面: 1. **SQL简介**:SQL代表结构化查询语言,由IBM的System R项目开发,用于操作关系型数据库系统。它支持多种操作,如创建...
Mysql数据库的DLL、DML语句语法,包括:对数据库的新增、修改、删除预防,对表结果的新增、修改、删除,对视图、索引、约束的操作。数据表的新增、修改、删除数据,查询语句的使用。