SQL Server数据库技术(42)[MSSQL防范]
本文“SQL Server数据库技术(42)[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
约束(Constraint)是Microsoft sql server 供应的自动保持数据库完好性的一种办法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完好性的介绍请拜见第9 章).在SQL Server 中有5 种约束:主关键字约束(Primary Key Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、查抄约束(Check Constraint)和缺省约束(Default Constraint).
7.2.1 主关键字约束
主关键字约束指定表的一列或几列的组合的值在表中具有惟一性,即能惟一地指定一行记录.每个表中只能有一列被指定为主关键字,且IMAGE 和TEXT 范例的列不能被指定为主关键字,也不答应指定主关键字列有NULL 属性.
定义主关键字约束的语法以下:
CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
各参数阐明以下:
- constraint_name
指定约束的名称约束的名称.在数据库中应是惟一的.假如不指定,则系统会自动生成一个约束名. - CLUSTERED | NONCLUSTERED
指定索引类别,CLUSTERED 为缺省值.其具体信息请拜见下一章. - column_name
指定构成主关键字的列名.主关键字最多由16 个列构成.
create table products (
p_id char(8) not null,
p_name char(10) not null ,
price money default 0.01 ,
quantity smallint null ,
constraint pk_p_id primary key (p_id, p_name)
) on [primary]
7.2.2 外关键字约束
外关键字约束定义了表之间的关系.当一个表中的一个列或多个列的组合和别的表中的主关键字定义相同时,便可以将这些列或列的组合定义为外关键字,并设定它合适哪个表中哪些列相关联.这样,当在定义主关键字约束的表中更新列值,时别的表中有与之相关联的外关键字约束的表中的外关键字列也将被呼应地做相同的更新.外关键字约束的作用还表目前,当向含有外关键字的表插入数据时,假如与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会回绝插入数据.与主关键字相同,不能利用一个定义为 TEXT 或IMAGE 数据范例的列成立外关键字.外关键字最多由16 个列构成.
定义外关键字约束的语法以下:
CONSTRAINT constraint_name
FOREIGN KEY (column_name1[, column_name2,…,column_name16])
REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ] ]
[ NOT FOR REPLICATION ]
各参数阐明以下:
- REFERENCES
指定要成立关联的表的信息. - ref_table
指定要成立关联的表的名称. - ref_column
指定要成立关联的表中的相关列的名称. - ON DELETE {CASCADE | NO ACTION}
指定在删除表中数据时,对关联表所做的相关操作.在子表中有数据行与父表中的对应数据行相关联的情形下,假如指定了值CASCADE,则在删除父表数据行时会将子表中对应的数据行删除;假如指定的是NO ACTION,则SQL Server 会产生一个错误,并将父表中的删除操作回滚.NO ACTION 是缺省值. - ON UPDATE {CASCADE | NO ACTION}
指定在更新表中数据时,对关联表所做的相关操作.在子表中有数据行与父表中的对应数据行相关联的情形下,假如指定了值CASCADE,则在更新父表数据行时会将子表中对应的数据行更新;假如指定的是NO ACTION,则SQL Server 会产生一个错误,并将父表中的更新操作回滚.NO ACTION 是缺省值. - NOT FOR REPLICATION
指定列的外关键字约束在把从别的表中复制的数据插入到表中时不发生作用.
例7-4:成立一个订货表,与前面成立的产品表相关联
create table orders(
order_id char(8),
p_id char(8),
p_name char(10) ,
constraint pk_order_id primary key (order_id) ,
foreign key(p_id, p_name) references products(p_id, p_name)
) on [primary]
注意:暂时表不能指定外关键字约束.
7.2.3 惟一性约束
惟一性约束指定一个或多个列的组合的值具有惟一性,以避免在列中输入反复的值.惟一性约束指定的列可以有NULL 属性.由于主关键字值是具有惟一性的,因此主关键字列不能再设定惟一性约束.惟一性约束最多由16 个列构成.
定义惟一性约束的语法以下:
CONSTRAINT constraint_name
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])
例7-5:定义一个员工信息表,此中员工的身份证号具有惟一性.
create table employees (
emp_id char(8),
emp_name char(10) ,
emp_cardid char(18),
constraint pk_emp_id primary key (emp_id),
constraint uk_emp_cardid unique (emp_cardid)
) on [primary]
7.2.4 查抄约束
查抄约束对输入列或整个表中的值设置查抄条件,以限制输入值,保证数据库的数据完好性.可以对每个列设置符合查抄.
定义查抄约束的语法以下:
CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)
各参数阐明以下:
NOT FOR REPLICATION
指定查抄约束在把从别的表中复制的数据插入到表中时不发生作用.
logical_expression
指定逻辑条件表达式返回值为TRUE 或FALSE.
例7-6: 成立一个订货表此中订货量必须不小于10.
create table orders(
order_id char(8),
p_id char(8),
p_name char(10) ,
quantity smallint,
constraint pk_order_id primary key (order_id),
constraint chk_quantity check (quantity>=10) ,
) on [primary]
注意:对计算列不能作除查抄约束外的任何约束.
7.2.5 缺省约束
缺省约束通过定义列的缺省值或利用数据库的缺省值对象绑定表的列,来指定列的缺省值.SQL Server 举荐利用缺省约束,而不利用定义缺省值的方法来指定列的缺省值.有关绑定缺省约束的办法请拜见"数据完好性"章节.
定义缺省约束的语法以下:
CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]
例7-7:
constraint de_order_quantity default 100 for order_quantity
注意:不能在成立表时定义缺省约束,只能向已经成立好的表中增添缺省约束.
7.2.6 列约束和表约束
关于数据库来说,约束又分为列约束(Column Constraint)和表约束(Table Constraint).
列约束作为列定义的一部份只作用于此列本身.表约束作为表定义的一部份,可以作用于
多个列.
下面举例阐明列约束与表约束的辨别.
例7-8:
create table products (
p_id char(8) ,
p_name char(10) ,
price money default 0.01 ,
quantity smallint check (quantity>=10) , /* 列约束 */
constraint pk_p_id primary key (p_id, p_name) /* 表约束 */
本文地址: | 与您的QQ/BBS好友分享! |