深入DDL
DDL(Data Definition Language,数据定义语言)命令是用来创建和管理数据库对象的。
CREATE TABLE:
除了创建表的作用之外,还可用来建立表间的公布参照完整性,也可用来创建默认列值,及建立关键字和唯一关键字约束。
外部关键字:外部关键字约束在两个表之间建立了一种关系,它确保了在参照表中插入或修改的关键字值在被参照表中存在,并且在删除参照表中相应行之前,被参照表中的关键字值不能被删除。
NULL值异常:
SQL Server严格地强迫外部关键字约束关系,只有一种重要的异常情况。如果参照表中的列允许NULL值,那么无论被参照表中是否有NULL项,NULL值被允许。
唯一索引要求:
外部关键字饮用的目标必须在被相关表参照的列上有唯一的索引。索引可以以几种形式存在;主关键字或唯一关键字约束,或者是普通的唯一关键字索引。
默认约束:
默认约束创建默认值。默认列值不仅可以使常数,还可以使CASE表达式,函数和其他类型的数值表达式(子查询除外),例如:
CREATE TABLE #testdc (ci int DEFAULT CASE WHEN SUSER_SNAME() = 'JOE' THEN 1 ELSE 0 END)
INSERT #testdc DEFAULT VALUES
SELECT * FROM #testdc
创建索引:
禁止位型和BLOB型索引
并不能将索引建在bit,text, ntext, image型的列上。除了bit之外,其他的几个都是BLOB型的数据类型,所以不能在它们上创建索引是合理的。
临时对象:
SQL server支持两种类型的临时对象-局部临时对象和全局临时对象,局部临时对象前缀为"#",全局临时对象前缀为"##"
临时存储过程:
对于表来说,可以通过在过程名前加前缀"#"来创建临时存储过程,可以通过加"##"来创建全局存储过程。
对象命名及相关性:
通过下列过程来解决不受限制对象的问题:
(1)SQL Server检查在当前数据库是否有以指定名为名字的对象。
(2)然后检查在当前数据库中DBO是否有该名字的表。
(3)如果指定的对象名前缀为"#",服务器将检查是否有该名字的局部临时表或过程。
(4)如果指点的对象名前缀为"##",服务器将检查是否有该名字的全局临时表或过程。
(5)如果指定对象名的前缀为"SP_",并且在有效的上下文关系中为存储过程使用该名字,那么服务器首先要检查当前数据库,然后检查master数据库看是否有该名字的个人或DBO的对象。
(6)如果不满足这些条件的一个,那么这个对象是找不到的,而且它是错误条件下的结果。
以上内容是《Transact-SQL权威指南》一书的读书笔记,感谢作者KEN HENDERSON 和 译者 健莲科技 中国电力出版社 为我带来这么经典的T-SQL书籍。
CREATE TABLE:
除了创建表的作用之外,还可用来建立表间的公布参照完整性,也可用来创建默认列值,及建立关键字和唯一关键字约束。
外部关键字:外部关键字约束在两个表之间建立了一种关系,它确保了在参照表中插入或修改的关键字值在被参照表中存在,并且在删除参照表中相应行之前,被参照表中的关键字值不能被删除。
NULL值异常:
SQL Server严格地强迫外部关键字约束关系,只有一种重要的异常情况。如果参照表中的列允许NULL值,那么无论被参照表中是否有NULL项,NULL值被允许。
唯一索引要求:
外部关键字饮用的目标必须在被相关表参照的列上有唯一的索引。索引可以以几种形式存在;主关键字或唯一关键字约束,或者是普通的唯一关键字索引。
默认约束:
默认约束创建默认值。默认列值不仅可以使常数,还可以使CASE表达式,函数和其他类型的数值表达式(子查询除外),例如:
CREATE TABLE #testdc (ci int DEFAULT CASE WHEN SUSER_SNAME() = 'JOE' THEN 1 ELSE 0 END)
INSERT #testdc DEFAULT VALUES
SELECT * FROM #testdc
创建索引:
禁止位型和BLOB型索引
并不能将索引建在bit,text, ntext, image型的列上。除了bit之外,其他的几个都是BLOB型的数据类型,所以不能在它们上创建索引是合理的。
临时对象:
SQL server支持两种类型的临时对象-局部临时对象和全局临时对象,局部临时对象前缀为"#",全局临时对象前缀为"##"
临时存储过程:
对于表来说,可以通过在过程名前加前缀"#"来创建临时存储过程,可以通过加"##"来创建全局存储过程。
对象命名及相关性:
通过下列过程来解决不受限制对象的问题:
(1)SQL Server检查在当前数据库是否有以指定名为名字的对象。
(2)然后检查在当前数据库中DBO是否有该名字的表。
(3)如果指定的对象名前缀为"#",服务器将检查是否有该名字的局部临时表或过程。
(4)如果指点的对象名前缀为"##",服务器将检查是否有该名字的全局临时表或过程。
(5)如果指定对象名的前缀为"SP_",并且在有效的上下文关系中为存储过程使用该名字,那么服务器首先要检查当前数据库,然后检查master数据库看是否有该名字的个人或DBO的对象。
(6)如果不满足这些条件的一个,那么这个对象是找不到的,而且它是错误条件下的结果。
以上内容是《Transact-SQL权威指南》一书的读书笔记,感谢作者KEN HENDERSON 和 译者 健莲科技 中国电力出版社 为我带来这么经典的T-SQL书籍。