例 1-5 create Table AppDta.dbo.Customer Not Null check(CustId>0), Not Null check(Name<>''),
ShipLine1 VarChar(100) Not Null Default '', ShipLine2 VarChar(100) Not Null Default '', Not Null Default '', Not Null Default '', ShipPostalCode1 Char (10) Not Null Default '', ShipPostalCode2 Char (10) Not Null Default '', Not Null Default '', Not Null Default '', Not Null Default '', Not Null Default '', CreditLimit Money( 1) Not Null Check ( (CreditLimit Is Null) Or (CreditLimit >=0)); EntryDateTime DateTime Not Null Default Current_Timestamp,
RowTimeStamp imeStamp Not Null, Key ( CustId), ( Status<>' ')Or (CreditLimit Is Null) ) ) Use AppDta 所有者名称也可以省略 SQL Server 会用当前的用户名作为所有者 完全限定的表名 和视图名必须是唯一的 SQL 对象名称可以长达 128 个字符 包括字母 数字和下述特殊的符号 _(下划线) #(井号) $(美元符号)和@(at 号) 如果只使用字母(A-Z)开头并且只包含字母和数字(0-9) 对于跨系统或者跨国应用程序 可以避免可能出现的命名问题 另外 Transact-SQL 有多个保留字 例如 Create Table 和 Order 它们有特殊的含义 这些保留字列在 Microsoft SQL Server Transact-SQL 参考手册中的 保留关键字 话题中 如果希望使用这些保留字作为表名 列名或者其他 SQL 对象名称 那么当它们出现在 SQL 语句中时 必须用双引号括起这些名称 下面这个示例说明如何编写一个 SQL Server 语句 从表名为 Order 的表中检索行 Select * From Order Where CustId = 499320 引号括起的名称也可以用于包含特殊字符的名称 如下示例 Select * From Order+Detail Where CustId = 499320 一般应避免使用 SQL 的保留字或者特殊的字符作为 SQL 对象的名称 注意 必须使用 SQL Server 的 quoted identifier 用户选项才能使用引号标识符 Transact-SQL 还允许使用方括号作为关键字的分隔符 例如 Order 这种语 法不需要引号标识符用户选项 1.2.2 在指定文件组上创建表正如在本章前面“定义文件组”一节中讨论的那样 可以定义文件组 它是一个或者多 个存储应用程序数据的操作系统文件的集合 为了把一个新表放在用户定义的文件组上 可以在 Create Table 语句的末端增加一个 On 子句 Create Table AppDta.dbo.Customer ( CustId Int Not Null Check ( CustId > 0 ), Name Char( 30 ) Not Null Check ( Name <> ‘ ’ ) ... Constraint CustomerStatus Check ( ( Status <. ‘ ’ ) Or ( CreditLimit Is Null ) ) ) On AppDtaGroup1 这个文件组必须已由 Alter Database 语句创建 注意 SQL 还有一个 Create Schema 语句 用于将多个 Create Table,CreateView 和
Grant 语句组合到一个 SQL 语句中 当处理 Create Schema 语句时 SQL Server 按序连续创建对象 以便满足所有的逻辑依赖关系(例如 视图和外键) 虽然 一般由代码生成器使用 Create Schema 语句 但是该语句也可以用于手工创建 有从属外键的两个或者多个表
达两万亿个表 为了用 SQL 创建表 输入一条 Create Table 语句 指定下述内容
包含表的数据库
表的所有者
表名 在同一个数据库中和同一个所有者下 该表名必须与任何其它基表或视图 不同
指定 1 到 1024 个列
主键约束(可选)
1 到 250 个 Unique 约束(可选)
1 到 253 个外键约束(可选)
1.2.1 创建表的一般要求
例 1-5 示意了一个比较复杂的 Customer 表的 Create Table 语句
正如例 1-5 所示 Create Table 语句首先指定将要创建的表 然后列出列和约束的定义
之间由逗号分开 用一组括号括住 SQL 是一种自由格式的语言 一条语句可以放在多行
上 在字和符号之间使用空格 以提高可读性 该示例说明代码样式 代码以每个列的定 义开始 约束单独占一行 每个列的定义中相似的部分对齐 虽然这种列样式不是必须的
但是它比不对齐的文本流形式更容易理解
SQL 关键字对大小写不敏感 Create Table CREATE TABLE 和 CrEaTe TaBLE 都是正 确的 然而 记住在安装 SQL Server 时选择的排列顺序决定标识符和字符串文字是否对大 小写敏感 如果使用对大小写不敏感的排列顺序(默认的安装选项)安装 SQL Server 那么 SQL
Server 认为表名 Customer customer 和 CUSTOMER 是相同的 并且‵x 等于‵x 如 果使用对大小写敏感的排列顺序安装 SQL Server 那么 SQL Server 把表名 Customer customer
和 CUSTOMER 作为不同的标识符 并且认为‵x 不等于‵X
注意 即使使用对大小写不敏感的排列顺序 系统表中的表名和其他对象名称也是以
输入它们的方式存储 例如 Customer customer或 CUSTOMER 因此 如果在 AppDta
数据库中显示表的清单 那么例 1-5 所示的语句创建的表将被列为 Customer,
使用对大小写不敏感的排列顺序 仍然可以在 SQL 语句中使用 CUSTOMER 或者
customer 引用该表
例 1-5 中使用的表名是一种完全限定的名称 在未限定的表名 Customer 之前包括 数据库名称(AppDta)和所有者名称 dbo 使用小圆点“.”作为限定名称的分隔符
当创建数据库对象时 一般建议在代码中明确指定数据库名称和所有者名称 这样可
以归类表的数据库和所有者 避免偶然在错误的数据库中或者使用错误的所有者创建表
正如本示例所示 为了创建一个由数据库所有者拥有的表 可以在限定的名称中使用 dbo
如果省略了数据库名称 就会在当前数据库中创建表 当前数据库可以是分配给 SQL Server 帐户的数据库 或者是在 Use 语句中指定的数据库 例 1-5 是 Customer 基表的 Create Table 语句
例 1-5
create Table AppDta.dbo.Customer
Not Null check(CustId>0),
Not Null
check(Name<>''),
ShipLine1 VarChar(100) Not Null
Default '', ShipLine2 VarChar(100) Not Null
Default '',
Not Null
Default '',
Not Null
Default '', ShipPostalCode1 Char (10) Not Null
Default '', ShipPostalCode2 Char (10) Not Null
Default '',
Not Null
Default '',
Not Null
Default '',
Not Null
Default '',
Not Null
Default '', CreditLimit Money( 1) Not Null
Check (
(CreditLimit Is Null) Or
(CreditLimit >=0)); EntryDateTime DateTime Not Null
Default Current_Timestamp,
RowTimeStamp imeStamp Not Null,
Key ( CustId),
( Status<>' ')Or
(CreditLimit Is Null) ) )
Use AppDta
所有者名称也可以省略 SQL Server 会用当前的用户名作为所有者 完全限定的表名
和视图名必须是唯一的
SQL 对象名称可以长达 128 个字符 包括字母 数字和下述特殊的符号 _(下划线)
#(井号) $(美元符号)和@(at 号) 如果只使用字母(A-Z)开头并且只包含字母和数字(0-9)
对于跨系统或者跨国应用程序 可以避免可能出现的命名问题
另外 Transact-SQL 有多个保留字 例如 Create Table 和 Order 它们有特殊的含义
这些保留字列在 Microsoft SQL Server Transact-SQL 参考手册中的 保留关键字 话题中
如果希望使用这些保留字作为表名 列名或者其他 SQL 对象名称 那么当它们出现在 SQL
语句中时 必须用双引号括起这些名称 下面这个示例说明如何编写一个 SQL Server 语句
从表名为 Order 的表中检索行
Select *
From Order
Where CustId = 499320
引号括起的名称也可以用于包含特殊字符的名称 如下示例
Select *
From Order+Detail
Where CustId = 499320
一般应避免使用 SQL 的保留字或者特殊的字符作为 SQL 对象的名称
注意 必须使用 SQL Server 的 quoted identifier 用户选项才能使用引号标识符
Transact-SQL 还允许使用方括号作为关键字的分隔符 例如 Order 这种语 法不需要引号标识符用户选项
1.2.2 在指定文件组上创建表正如在本章前面“定义文件组”一节中讨论的那样 可以定义文件组 它是一个或者多 个存储应用程序数据的操作系统文件的集合 为了把一个新表放在用户定义的文件组上
可以在 Create Table 语句的末端增加一个 On 子句
Create Table AppDta.dbo.Customer
( CustId Int Not Null
Check ( CustId > 0 ), Name Char( 30 ) Not Null
Check ( Name <> ‘ ’ )
...
Constraint CustomerStatus Check ( ( Status <. ‘ ’ ) Or
( CreditLimit Is Null ) ) )
On AppDtaGroup1
这个文件组必须已由 Alter Database 语句创建
注意 SQL 还有一个 Create Schema 语句 用于将多个 Create Table,CreateView 和
Grant 语句组合到一个 SQL 语句中 当处理 Create Schema 语句时 SQL Server
按序连续创建对象 以便满足所有的逻辑依赖关系(例如 视图和外键) 虽然
一般由代码生成器使用 Create Schema 语句 但是该语句也可以用于手工创建
有从属外键的两个或者多个表