|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
支持多种存储引擎。束缚(Constraint)是MicrosoftSQLServer供应的主动坚持数据库完全性的一种办法,界说了可输出表或表的单个列中的数据的限定前提(有关数据完全性的先容请拜见第9章)。在SQLServer中有5种束缚:主关头字束缚(PrimaryKeyConstraint)、外关头字束缚(ForeignKeyConstraint)、唯一性束缚(UniqueConstraint)、反省束缚(CheckConstraint)和缺省束缚(DefaultConstraint)。
7.2.1主关头字束缚
主关头字束缚指定表的一列或几列的组合的值在表中具有唯一性,即能唯一地指定一行纪录。每一个表中只能有一列被指定为主关头字,且IMAGE和TEXT范例的列不克不及被指定为主关头字,也不同意指定主关头字列有NULL属性。
界说主关头字束缚的语法以下:
CONSTRAINTconstraint_name
PRIMARYKEY[CLUSTERED|NONCLUSTERED]
(column_name1[,column_name2,…,column_name16])
各参数申明以下:<P>
- constraint_name
指定束缚的称号束缚的称号。在数据库中应是唯一的。假如不指定,则体系会主动天生一个束缚名。
- CLUSTERED|NONCLUSTERED
指定索引种别,CLUSTERED为缺省值。其详细信息请拜见下一章。
- column_name
指定构成主关头字的列名。主关头字最多由16个列构成。
例7-3:创立一个产物信息表,以产物编号和称号为主关头字
createtableproducts(
p_idchar(8)notnull,
p_namechar(10)notnull,
pricemoneydefault0.01,
quantitysmallintnull,
constraintpk_p_idprimarykey(p_id,p_name)
)on[primary]
7.2.2外关头字束缚
外关头字束缚界说了表之间的干系。当一个表中的一个列或多个列的组合和别的表中的主关头字界说不异时,就能够将这些列或列的组合界说为外关头字,并设定它合适哪一个表中哪些列相干联。如许,当在界说主关头字束缚的表中更新列值,时别的表中有与之相干联的外关头字束缚的表中的外关头字列也将被响应地做不异的更新。外关头字束缚的感化还表现在,当向含有外关头字的表拔出数据时,假如与之相干联的表的列中无与拔出的外关头字列值不异的值时,体系会回绝拔出数据。与主关头字不异,不克不及利用一个界说为TEXT或IMAGE数据范例的列创立外关头字。外关头字最多由16个列构成。
界说外关头字束缚的语法以下:
CONSTRAINTconstraint_name
FOREIGNKEY(column_name1[,column_name2,…,column_name16])
REFERENCESref_table[(ref_column1[,ref_column2,…,ref_column16])]
[ONDELETE{CASCADE|NOACTION}]
[ONUPDATE{CASCADE|NOACTION}]]
[NOTFORREPLICATION]
各参数申明以下:<P>
- REFERENCES
指定要创建联系关系的表的信息。
- ref_table
指定要创建联系关系的表的称号。
- ref_column
指定要创建联系关系的表中的相干列的称号。
- ONDELETE{CASCADE|NOACTION}
指定在删除表中数据时,对联系关系表所做的相干操纵。在子表中无数据行与父表中的对应数据行相干联的情形下,假如指定了值CASCADE,则在删除父表数据行时会将子表中对应的数据行删除;假如指定的是NOACTION,则SQLServer会发生一个毛病,并将父表中的删除操纵回滚。NOACTION是缺省值。
- ONUPDATE{CASCADE|NOACTION}
指定在更新表中数据时,对联系关系表所做的相干操纵。在子表中无数据行与父表中的对应数据行相干联的情形下,假如指定了值CASCADE,则在更新父表数据行时会将子表中对应的数据行更新;假如指定的是NOACTION,则SQLServer会发生一个毛病,并将父表中的更新操纵回滚。NOACTION是缺省值。
- NOTFORREPLICATION
指定列的外关头字束缚在把从别的表中复制的数据拔出到表中时不产生感化。
例7-4:创立一个定货表,与后面创立的产物表相干联
createtableorders(
order_idchar(8),
p_idchar(8),
p_namechar(10),
constraintpk_order_idprimarykey(order_id),
foreignkey(p_id,p_name)referencesproducts(p_id,p_name)
)on[primary]
注重:一时表不克不及指定外关头字束缚。
7.2.3唯一性束缚
唯一性束缚指定一个或多个列的组合的值具有唯一性,以避免在列中输出反复的值。唯一性束缚指定的列能够有NULL属性。因为主关头字值是具有唯一性的,因而主关头字列不克不及再设定唯一性束缚。唯一性束缚最多由16个列构成。
界说唯一性束缚的语法以下:
CONSTRAINTconstraint_name
UNIQUE[CLUSTERED|NONCLUSTERED]
(column_name1[,column_name2,…,column_name16])
例7-5:界说一个员工信息表,个中员工的身份证号具有唯一性。
createtableemployees(
emp_idchar(8),
emp_namechar(10),
emp_cardidchar(18),
constraintpk_emp_idprimarykey(emp_id),
constraintuk_emp_cardidunique(emp_cardid)
)on[primary]
7.2.4反省束缚
反省束缚对输出列或全部表中的值设置反省前提,以限定输出值,包管数据库的数据完全性。能够对每一个列设置切合反省。
界说反省束缚的语法以下:
CONSTRAINTconstraint_name
CHECK[NOTFORREPLICATION]
(logical_expression)
各参数申明以下:
NOTFORREPLICATION
指定反省束缚在把从别的表中复制的数据拔出到表中时不产生感化。
logical_expression
指定逻辑前提表达式前往值为TRUE或FALSE。
例7-6:创立一个定货表个中订货量必需不小于10。
createtableorders(
order_idchar(8),
p_idchar(8),
p_namechar(10),
quantitysmallint,
constraintpk_order_idprimarykey(order_id),
constraintchk_quantitycheck(quantity>=10),
)on[primary]
注重:对盘算列不克不及作除反省束缚外的任何束缚。
7.2.5缺省束缚
缺省束缚经由过程界说列的缺省值或利用数据库的缺省值工具绑定表的列,来指定列的缺省值。SQLServer保举利用缺省束缚,而不利用界说缺省值的体例来指定列的缺省值。有关绑定缺省束缚的办法请拜见“数据完全性”章节。
界说缺省束缚的语法以下:
CONSTRAINTconstraint_name
DEFAULTconstant_expression[FORcolumn_name]
例7-7:
constraintde_order_quantitydefault100fororder_quantity
注重:不克不及在创立表时界说缺省束缚,只能向已创立好的表中增加缺省束缚。
7.2.6列束缚和表束缚
关于数据库来讲,束缚又分为列束缚(ColumnConstraint)和表束缚(TableConstraint)。
列束缚作为列界说的一部分只感化于此列自己。表束缚作为表界说的一部分,能够感化于
多个列。
上面举例申明列束缚与表束缚的区分。
例7-8:
createtableproducts(
p_idchar(8),
p_namechar(10),
pricemoneydefault0.01,
quantitysmallintcheck(quantity>=10),/*列束缚*/
constraintpk_p_idprimarykey(p_id,p_name)/*表束缚*/
InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定 |
|