仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 697|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL编程:创立和利用束缚

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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事务,支持行级锁定
小妖女 该用户已被删除
沙发
发表于 2015-1-19 08:40:52 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
再见西城 该用户已被删除
板凳
发表于 2015-1-25 23:24:58 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
深爱那片海 该用户已被删除
地板
发表于 2015-2-4 13:21:47 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
透明 该用户已被删除
5#
发表于 2015-2-9 23:34:07 | 只看该作者
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
若相依 该用户已被删除
6#
发表于 2015-2-28 08:24:19 | 只看该作者
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
分手快乐 该用户已被删除
7#
发表于 2015-3-17 02:07:54 | 只看该作者
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
不帅 该用户已被删除
8#
发表于 2015-3-23 16:53:46 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-7 03:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表