数据库碎知识点.docx
- 文档编号:24552223
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:7
- 大小:18.76KB
数据库碎知识点.docx
《数据库碎知识点.docx》由会员分享,可在线阅读,更多相关《数据库碎知识点.docx(7页珍藏版)》请在冰豆网上搜索。
数据库碎知识点
一、sql中delete,drop,truncate都代表删除,但3者又有一些区别
1.truncate和delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete语句是dml,这个操作会放到rollbacksegement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
truncate,drop是ddl,操作立即生效,原数据不放到rollbacksegment中,不能回滚.操作不触发trigger.
3.delete语句不影响表所占用的extent,高水线(highwatermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate语句缺省情况下见空间释放到minextents个extent,除非使用reusestorage;truncate会将高水线复位(回到最开始).
4.速度,一般来说:
drop>;truncate>;delete
5.安全性:
小心使用drop和truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句.回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除.如果和事务无关,用truncate即可.如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reusestroage,再重新导入/插入数据
在实际应用中,三者的区别是明确的。
当你不再需要该表时,用drop;
当你仍要保留该表,但要删除所有记录时,用truncate;
当你要删除部分记录时(alwayswithaWHEREclause),用delete.
而alter是对表结构的修改.
二、当操作违反了完整性约束条件,系统是如何处理的。
对于违反实体完整性和用户定义完整性的操作一般都是采用拒绝执行的方式进行处理的。
而违反参照完整性的操作,并不是简单的拒绝执行,有时要根据应用语义执行一些附加操作,以保证数据库的正确。
完整性约束的SQL定义
更新数据库时,表中不能出现不符合完整性要求的记录,以保证为用户提供正确、有效的数据。
实现该目的最直接的方法,是在编写数据库应用程序时,对每个更新操作都进行完整性检查。
但这种检查往往是复杂、重复、低效的。
SQL把各种完整性约束作为数据库模式定义的一部分,由数据库管理系统维护,这样即可有效防止对数据库的意外破坏,提高了完整性检测的效率,又减轻了编程人员的负担。
SQLServer支持三种完整性约束:
1、实体完整性
2、参照完整性(或引用完整性)
3、用户自定义完整性
1、实体完整性和主码
实体完整性是通过主码(PRIMARYKEY)的定义来实现的。
一旦某个属性或属性组被定义为主码,该主码的每个属性就不能为空值,并且在表中不能出现主码值完全相同的两个记录。
主码可以在CREATETABLE语句中使用PRIMARYKEY定义。
有两种定义主码的方法:
一种是在属性后增加关键字,另一种是在属性表中加入额外的定义主码的子句:
PRIMARYKEY(主码属性名表)。
(1)属性后增加关键字定义
CREATETABLEStudentInfo
(
StudentIDchar(8)PRIMARYKEY,
StudentNamevarchar(10),
StudentSexbit
);
(2)加入额外的定义主码的子句
CREATETABLEStudentInfo
(
StudentIDchar(8),
StudentNamevarchar(10),
StudentSexbit,
PRIMARYKEY(StudentID)
);
如果表的主码只含有单个属性,上面的两种方法都可以使用。
如果主码由多个属性组成,只能使用第二种方法。
除了主码,SQL提供了类似候选码的说明方法,使用关键字UNIQUE定义(与候选码不同的是:
定义为UNIQUE的属性可以定义为空值,但只能有一个记录该属性的值为NULL),说明该属性(或属性组)的值不能重复。
一个表中只能有一个主码,但可以有多个“UNIQUE”定义。
2、参照完整性(引用完整性)约束和外部码
在更新记录时,参照完整性保持表之间已定义的关系。
参照完整性基于外键与主键之间或外键与唯一键之间的关系。
参照完整性确保键值在所有表中一致。
这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。
强制参照完整性时,SQLServer禁止用户进行下列操作:
<1>当主表中没有关联的记录时,将记录添加到相关表中。
<2>更改主表中的值并导致相关表中的记录孤立。
<3>从主表中删除记录,但仍存在与该记录匹配的相关记录。
(1)外部码约束的说明
说明外部码的方法有两种:
<1>在该属性的说明(属性名、类型)后直接加上关键字REFERENCES,后跟对应表的主码说明
格式为:
REFERENCES<父表名>(<属性名>)
说明RelationInfo表中StudentID为外部码,参照关系为StudentInfo。
CREATETABLERelationInfo
(
RelationIDintidentity(1,1),
StudentIDchar(8)REFERENCESStudentInfo(StudentID),
DepartIDchar(4)
);
<2>在CREATETABLE语句的属性清单后,加上外部码的说明子句
格式为:
FOREIGN(<属性名表>)REFERENCES<父表名>(<属性名表>)
CREATETABLERelationInfo
(
RelationIDintidentity(1,1),
StudentIDchar(8),
DepartIDchar(4),
FOREIGNKEY(StudentID)REFERENCESStudentInfo(StudentID)
);
(2)参照完整性约束的实现策略
当用户的操作违反了上述规则时,SQL提供了两种可选方案供数据库实现者使用:
RESTRICT(限制策略);CASCADE(级联策略);
<1>限制策略
限制策略是SQL的默认策略,任何违反参照完整性的更新均被系统拒绝。
<2>级联策略
当用户删除或更新外键所指向的键时,SQL提供了另一种方案,即级联策略。
通过在REFERENCES子句后添加ONDELETE和ONUPDATE子句实现:
[ONDELETE{CASCADE|NOACTION}]
[ONUPDATE{CASCADE|NOACTION}]
如果没有指定ONDELETE或ONUPDATE,则默认为NOACTION。
ONDELETENOACTION
指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚DELETE。
ONUPDATENOACTION
指定如果试图更新某行中的键值,而该行含有由其它表的现有行中的外键所引用的键,则产生错误并回滚UPDATE。
CASCADE允许在表间级联键值的删除或更新操作,这些表的外键关系可追溯到执行修改的表。
不能为任何具有timestamp列的外键和主键指定CASCADE。
ONDELETECASCADE
指定如果试图删除某行,而该行含有由其它表的现有行中的外键所引用的键,则也将删除所有包含那些外键的行。
如果在目标表上也定义了级联引用操作,则对从那些表中删除的行同样采取指定的级联操作。
ONUPDATECASCADE
指定如果试图更新某行中的键值,而该行的键值由其它表的现有行中的外键所引用,则所有外键值也将更新成为该键指定的新值。
如果在目标表上也定义了级联引用操作,则对在那些表中更新的键值同样采取指定的级联操作。
3、用户自定义完整性约束
SQL提供非空约束、对属性的CHECK约束、对元组的CHECK约束、触发器等来实现用户的完整性要求。
<1>基于属性的CHECK约束
使用CHECK(检查)子句可保证属性值满足某些前提条件。
CHECK子句的一般格式为:
CHECK<条件>
属性的CHECK约束既可跟在属性的定义后,也可在定义语句中另增一子句加以说明。
设定StudentInfo表中age值不能小于18、大于65。
只需将age属性说明为如下形式:
ageintCHECK(age>=18andage<=65)
<2>基于元组的约束
CREATETABLEsalary
(
Enochar(4),
Basepaydecimal(7,2),
Insuredecimal(7,2),
Funddecimal(7,2),
CHECK(Insure+Fund ); 上面例子中,CHECK约束涉及到表中多个属性,为元组约束。 约束的更新 约束与数据库中的表、视图等一样,可以进行增加、删除和修改的更新操作。 为了更新约束,需要在定义约束是对约束进行命名,在约束前加上关键字CONSTRAINT和该约束的名称。 例如要说明StudentInfo表中的主码时,将其命名为PK_StudentInfo_ID CREATETABLEStudentInfo ( StudentIDchar(8), StudentNamevarchar(10), StudentSexbit, CONSTRAINTPK_StudentInfo_IDPRIMARYKEY(StudentID) ); 可以使用ALTERTABLE语句来更新与属性或表有关的约束。 (1)删除约束: ALTERTABLEDROPCONSTRAINT约束名 (2)增加约束 ALTERTABLEADDCONSTRAINT约束名约束定义 三、比如在选课数据库中显示结果如下: SELECTSname,MAX(Grade) FROMSC,Student WHERESC.Sno=Student.Sno; 结果: 消息8120,级别16,状态1,第1行 选择列表中的列'Student.Sname'无效,因为该列没有包含在聚合函数或GROUPBY子句中。 XX的结果: GROUPBY子句 指定用来放置输出行的组,并且如果SELECT子句中包含聚合函数,则计算每组的汇总值。 指定GROUPBY时,选择列表中任一非聚合表达式内的所有列都应包含在GROUPBY列表中,或者GROUPBY表达式必须与选择列表表达式完全匹配。 SELECTU_ID,House_Addrinfo, COUNT(U_ID)ASCX FROMYX_ChuShou GROUPBYU_ID ORDERBYCXDESC 这条语句出现"选择列表中的列'YX_ChuShou.House_Addrinfo'无效,因为该列没有包含在聚合函数或GROUPBY子句中。 "的错误提示。 正确的写法是: SELECTU_ID,min(House_Addrinfo), COUNT(U_ID)ASCX FROMYX_ChuShou GROUPBYU_ID ORDERBYCXDESC 或 SELECTU_ID,House_Addrinfo, COUNT(U_ID)ASCX FROMYX_ChuShou GROUPBYU_ID,House_Addrinfo ORDERBYCXDESC 四、确保您的数据库兼容模式设置为90 ALTERDATABASE学生选课数据库 SETCOMPATIBILITY_LEVEL=90 --or EXECsp_dbcmptlevel学生选课数据库,90; GO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 知识点