《锋利的SQL(第2版)》——2.2 创建数据库

本节书摘来自异步社区出版社《锋利的SQL(第2版)》一书中的第2章,第2.2节,作者:张洪举 王晓文,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 创建数据库

锋利的SQL(第2版)
在创建数据库之前,必须先确定数据库的名称、所有者、大小以及存储该数据库的文件和文件组。所谓所有者,即是创建数据库的用户。一般情况下,大多数产品对象由数据库所有者拥有。

在创建数据库之前,应注意下列事项。

要创建数据库,必须至少拥有CREATE DATABASE、CREATE ANY DATABASE或ALTER ANY DATABASE权限。
创建数据库的用户将成为该数据库的所有者。
对于一个SQL Server实例,最多可以创建32767个数据库。
数据库名称必须遵循为标识符指定的规则。
在创建新数据库时,model数据库中的所有用户定义对象都将复制到所有新创建的数据库中。因此,可以向model数据库中添加任何对象(如表、视图、存储过程和数据类型),以便将这些对象包含到所有新创建的数据库中。

2.2.1 CREATE DATABASE语句的语法格式

可以使用CREATE DATABASE语句创建数据库,其语法格式如下:

CREATE DATABASE database_name 
  [ ON 
    [ PRIMARY ] [ <filespec> [ ,...n ] 
    [ , <filegroup> [ ,...n ] ] 
  [ LOG ON { <filespec> [ ,...n ] } ] 
  ] 
  [ COLLATE collation_name ]
][;]

database_name

要创建的新数据库的名称。

ON

指定以显式定义方式指定存储数据库数据部分的磁盘文件(数据文件)。

PRIMARY

指定列表中的主文件。在项中的第一个文件将成为主文件。如果没有指定PRIMARY,则CREATE DATABASE语句中列出的第一个文件将成为主文件。

LOG ON

指定存储数据库日志的磁盘文件(日志文件)。LOG ON后跟着以逗号分隔的用于定义日志文件的项列表。如果没有指定LOG ON,将自动创建一个日志文件,其大小为该数据库的所有数据文件大小总和的25%或512 KB,取两者之中的较大者。

COLLATE collation_name

指定数据库的默认排序规则。排序规则名称既可以是Windows排序规则名称,也可以是SQL排序规则名称。如果没有指定排序规则,则将SQL Server实例的默认排序规则分配为数据库的排序规则。排序规则一般用于SELECT查询的ORDER BY子句,详细信息参考5.6节的介绍。

CREATE DATABASE语句中的部分用于控制文件属性,其语法格式如下:

(
  NAME = logical_file_name ,
  FILENAME = 'os_file_name' 
    [ , SIZE = size [ KB | MB | GB | TB ] ] 
    [ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ] 
    [ , FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]
) [ ,...n ]

NAME logical_file_name

指定文件的逻辑名称。logical_file_name必须在数据库中唯一,必须符合标识符规则。

FILENAME ' os_file_name '

指定操作系统(物理)文件名称。执行CREATE DATABASE语句前,指定路径必须存在。如果指定了UNC(通用命名约定)路径,则无法设置SIZE、MAXSIZE和FILEGROWTH参数。

SIZE size

指定文件的初始大小。如果没有为主文件指定size,则数据库引擎将使用model数据库中的主文件的大小。如果指定了辅助数据文件或日志文件,但未指定该文件的size,则数据库引擎将以1 MB作为该文件的大小。

可以使用千字节(KB)、兆字节(MB)、千兆字节(GB)或兆兆字节(TB)后缀,默认为 MB。

MAXSIZE max_size

指定文件可增大到的最大大小,可以使用KB、MB、GB和TB后缀,默认为 MB。

UNLIMITED

指定文件将增长到磁盘已满。在SQL Server中,指定为不限制增长的日志文件的最大大小为2 TB,而数据文件的最大大小为16 TB。

FILEGROWTH growth_increment

指定每次需要新空间时为文件添加的空间量。growth_increment值不能超过MAXSIZE设置值。该值可以使用MB、KB、GB、TB或百分比(%)为单位指定。默认值为MB。growth_increment值为0时表明自动增长被关闭,不允许增加空间。

如果未指定FILEGROWTH,则数据文件的默认值为1 MB,日志文件的默认增长比例为10%,并且最小值为64 KB。

CREATE DATABASE语句中的部分用于控制文件组属性,其语法格式如下:

FILEGROUP filegroup_name [ DEFAULT ]
  <filespec> [ ,...n ]
FILEGROUP filegroup_name

文件组的逻辑名称。filegroup_name必须在数据库中唯一,不能是系统提供的名称PRIMARY和PRIMARY_LOG。

DEFAULT

定文件组为数据库中的默认文件组。

2.2.2 创建数据库示例

1.创建未指定文件的数据库
下面的语句将创建名为mydata的数据库,并创建相应的主文件和事务日志文件。因为语句没有项,所以主数据库文件的大小为model数据库主文件的大小。事务日志将设置为下列值中的较大者:512 KB 或主数据文件大小的25%。因为没有指定MAXSIZE,文件可以增大到填满所有可用的磁盘空间为止。

CREATE DATABASE mydata

2.创建指定数据和事务日志文件的数据库
下面的语句将创建数据库Sales。因为没有使用关键字PRIMARY,第一个文件(Sales_dat)将成为主文件。因为在Sales_dat文件的SIZE参数中没有指定MB或KB,将默认按MB分配。Sales_log文件以MB为单位进行分配,因为SIZE参数中显式声明了MB后缀。

CREATE DATABASE Sales
ON 
( NAME = Sales_dat,
  FILENAME = 'c:\saledat.mdf',
  SIZE = 10,
  MAXSIZE = 50,
  FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
  FILENAME = 'c:\salelog.ldf',
  SIZE = 5MB,
  MAXSIZE = 25MB,
  FILEGROWTH = 5MB ) ;

3.通过指定多个数据和事务日志文件创建数据库
下面的语句将创建数据库Archive,该数据库具有3个100 MB的数据文件和两个100 MB事务日志文件。主文件是列表中的第一个文件,并使用PRIMARY关键字显式指定。事务日志文件在LOG ON关键字后指定。

CREATE DATABASE Archive 
ON
PRIMARY 
  (NAME = Arch1,
  FILENAME = 'c:\archdat1.mdf',
  SIZE = 100MB,
  MAXSIZE = 200,
  FILEGROWTH = 20),
  ( NAME = Arch2,
  FILENAME = 'c:\archdat2.ndf',
  SIZE = 100MB,
  MAXSIZE = 200,
  FILEGROWTH = 20),
  ( NAME = Arch3,
  FILENAME = 'c:\archdat3.ndf',
  SIZE = 100MB,
  MAXSIZE = 200,
  FILEGROWTH = 20)
LOG ON 
  (NAME = Archlog1,
  FILENAME = 'c:\archlog1.ldf',
  SIZE = 100MB,
  MAXSIZE = 200,
  FILEGROWTH = 20),
  (NAME = Archlog2,
  FILENAME = 'c:\archlog2.ldf',
  SIZE = 100MB,
  MAXSIZE = 200,
  FILEGROWTH = 20) ;

4.创建具有文件组的数据库
下面的语句将创建数据库Sales,该数据库具有以下文件组。

包含文件Spri1_dat和Spri2_dat的PRIMARY文件组。将这些文件的FILEGROWTH增量指定为15%。
名为SalesGroup1的文件组,其中包含文件SGrp1Fi1和SGrp1Fi2。
名为SalesGroup2的文件组,其中包含文件SGrp2Fi1和SGrp2Fi2。

CREATE DATABASE Sales
ON PRIMARY
( NAME = SPri1_dat,
  FILENAME = 'c:\SPri1dat.mdf',
  SIZE = 10,
  MAXSIZE = 50,
  FILEGROWTH = 15% ),
( NAME = SPri2_dat,
  FILENAME = 'c:\SPri2dt.ndf',
  SIZE = 10,
  MAXSIZE = 50,
  FILEGROWTH = 15% ),
FILEGROUP SalesGroup1
( NAME = SGrp1Fi1_dat,
  FILENAME = 'c:\SG1Fi1dt.ndf',
  SIZE = 10,
  MAXSIZE = 50,
  FILEGROWTH = 5 ),
( NAME = SGrp1Fi2_dat,
  FILENAME = 'c:\SG1Fi2dt.ndf',
  SIZE = 10,
  MAXSIZE = 50,
  FILEGROWTH = 5 ),
FILEGROUP SalesGroup2
( NAME = SGrp2Fi1_dat,
  FILENAME = 'c:\SG2Fi1dt.ndf',
  SIZE = 10,
  MAXSIZE = 50,
  FILEGROWTH = 5 ),
( NAME = SGrp2Fi2_dat,
  FILENAME = 'c:\SG2Fi2dt.ndf',
  SIZE = 10,
  MAXSIZE = 50,
  FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
  FILENAME = 'c:\salelog.ldf',
  SIZE = 5MB,
  MAXSIZE = 25MB,
  FILEGROWTH = 5MB ) ;

5.创建数据库并指定排序规则名称
下面的示例将创建数据库MyOptionsTest,并将排序规则指定为French_CI_AI。

CREATE DATABASE MyOptionsTest
COLLATE French_CI_AI;
可以使用下面的语句验证数据库的选项设置:

SELECT name, collation_name
FROM sys.databases
WHERE name = N'MyOptionsTest';

在创建数据库后,应当备份master数据库。因为创建数据库将更新master中的系统表。如果master需要还原,则从上次备份master之后新建的所有数据库都将仍然在系统表中有引用,因而可能导致出现错误信息。

2.2.3 判断数据库是否已经存在

可以使用DB_ID函数判断数据库是否已经存在,该函数用于返回数据库的标识号,如果标识号不为空,则表示数据库已经存在。例如,下面的语句返回AdventureWorks数据库的标识号。

SELECT DB_ID(N'AdventureWorks') AS [Database ID];
GO

如果未指定数据库名称参数,则返回当前数据库的标识号。例如,下面的语句返回当前数据库master的标识号。

USE master; -- 切换到master数据库
GO
SELECT DB_ID() AS [Database ID]; -- 返回当前数据库的标识号
GO

实际上,在创建示例数据库时经常用到该函数。例如,下面的语句首先判断要创建的mytest数据库是否已经存在,如果存在则先删除掉,然后再新建数据库。

USE master;
GO
IF DB_ID (N'mytest') IS NOT NULL
DROP DATABASE mytest;
GO
CREATE DATABASE mytest;
GO

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值