T-SQL 之 DDL语法

  CREATE语句的开头都是一样的,然后是特定的细节。

CREATE <object type> <object name>  

一、CREATE DATABASE

  CREATE DATABASE命令用于创建一个数据库,创建一个数据库的最基本语法如下所示:

CREATE DATABASE <database name>

  CREATE DATABASE的完整语法

CREATE DATABASE <NewDataBase>
[ON [PRIMARY]
    ([NAME = <'logical file name'>,]
    FILENAME = <'file name'>
    [, SIZE = <size in kilobytes,megabytes,gigabytes,or terabytes>]
    [, MAXSIZE = <size in kilobytes,megabytes,gigabytes,or terabytes>]
    [, FILEGROWTH = <kilobytes,megabytes,gigabytes,or terabytes|percentage>])]
    [LOG ON
    ([NAME = <'logical file name'>,]
    FILENAME = <'file name'>
    [, SIZE = <size in kilobytes,megabytes,gigabytes,or terabytes>]
    [, MAXSIZE = <size in kilobytes,megabytes,gigabytes,or terabytes>]
    [, FILEGROWTH = <kilobytes,megabytes,gigabytes,or terabytes|percentage>])]
    [COLLATE <collation name>]
    [FOR ATTAH [WITH <service broker>]| FOR ATTACH_REBUILD_LOG| WITH DB_CHAINING 
    ON| OFF | TRUSTWORTHY ON|OFF]
    [AS SNAPSHOT OF <source database name>]
    [;]

  说明一下:

  1、ON

  ON用于两个地方:一是定义存储数据的文件位置,二是定义存储日志的文件位置。PRIMARY意味着随后是存储数据的主文件组。也可以将数据存储在所谓的附属文件组里。

  SQL Server允许将数据库存储在多个文件中,而且允许将这些文件放在一个逻辑组里面,称为文件组

  2、NAME

  这个选项用于指定定义的文件的名称,但只是一个逻辑名称-SQL Server在内部使用该名称引用该文件。当需要修改(扩充或缩小)数据库和/或文件的大小事,需要使用这个名称。

  3、FILENAME

  这个选项,顾名思义-实际操作系统文件在磁盘上的物理名称,在该文件中将存储数据或日志(取决于定义哪个部分)。默认情况下,文件位于\Program Files\Microsoft SQLServer10.MSSQLSERVER\MSSQL(或者SQL Server安装主目录)的\Data子目录下。如果是处理物理数据库文件,那么名称将和数据库名称一样,但是带有.mdf扩展名。如果处理日志文件,那么名称和数据库文件的名称一样,但是有后缀_Log以及扩展名.ldf。建议使用默认扩展名.mdf(数据库)和.ldf(日志文件)。附属文件的扩展名是.ndf。

  4、SIZE

  数据库的初始大小。默认情况下大小的单位是M(兆字节),但是可以通过在数字后面使用KB而不是MB来指定kilobyte(千字节),或者更大的单位GB或者甚至TB。这个值至少与模型数据库一样大,而且必须是整数(不能带小数),否则出错。如果没有为SIZE提供一个值,那么数据库的初始大小值与模型数据库一样。

  5、MAXSIZE

  SQL Server有一个机制允许数据库在必要的时候自动分配附加的磁盘空间(增加大小)。MAXSIZE是数据库可以增加的最大大小。默认情况下,单位是M,但是同SIZE一样,可以使用KB、GB、TB来指定不同的单位。稍微不同的是,这个选项没有固定的默认值。如果没有提供这个值,那么认为没有最大值-实际的大小可以达到磁盘空间用完为止。

  如果数据库的大小达到了MAXSIZE参数指定的值,那么将开始出错,插入数据将不能执行。如果日志达到最大值,那么在数据库中将无法执行任何日志活动。

  6、FILEGROWTH

  FILEGROWTH主要用于确定数据库达到这个最大值的速度。提供一个值来说明文件每次增加多少字节(以KB、MB、GB、TB为单位)。或者,也可以按照指定数据库文件的每次增长百分比。如果选择百分比,那么数据库大小将按照当前数据文件的大小以指定的百分比增长。因此,如果指定一个初始大小为1GB的数据库文件以20%的速度增长,那么第一次扩展后为1.2GB,第二次扩展后为1.44GB。

  7、LOG ON

  LOG ON选项允许指定哪些文件需要日志,以及这些文件位于什么位置。如果没有指定该选项,那么SQL Server将在一个单独文件中创建日志,日志文件默认的大小是数据库文件的25%。在大多数其他方面,日志文件与主数据库文件具有同样的文件规范参数。

  提示:

  日志文件最好存储在与主数据文件不同的磁盘分区上。这样除了提供针对某个磁盘驱动器失效的额外安全措施外,还可以避免主数据文件与日志文件竞争磁盘文件的输入输出口。

  8、COLLATE

  该选项处理排序、字母大小写以及是否重音敏感问题。在安装SQL Server时,提供了默认的排序规则,但是可以在数据库层重写该默认值。

  9、FOR ATTACH

  可以使用该选项将已存在的一些数据库文件附加到当前的服务器上。这里的文件必须是数据库的一部分,并且在某个时候已经使用sp_detach_db恰当地与数据库分离了。这样贬低了sp_detach_db的功能,但是带有FOR ATTACH的CREATE DATABASE命令具有可以访问32000多个文件的优点,而sp_attach_db只限于16个文件。

  如果使用FOR ATTACH,那么必须完成文件位置信息中的ON PRIMARY部分的设置。CREATE DATABASE参数列表的其他部分可以省略,只要把数据库的文件路径附加到与原来数据库分离时相同的文件路径中。

  10、WITH DB CHAINING ON|OFF

  如果打开该选项,那么跨数据库的所有权链有效,而关闭该选项,则所有权链无效。

  11、TRUSTWORTHY

  这个选项是新添加的选项,为访问在SQL Server环境以外的系统资源和文件添加额外的安全层。例如,可能运行.NET程序集访问网络上的文件,如果这样的话,那么必须检查数据库确保程序集是可以信赖的。由于安全原因,这个选项在默认情况下是关闭的-在确实明白您将要做的事情和原因之后,再打开这个选项。

   示例:

CREATE DATABASE Accounting
ON
(
    NAME = 'Accounting',  --数据库名称
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AccountingData.mdf',  --数据库文件位置
    SIZE = 10,  --大小 10M
    MAXSIZE = 50,  --最大大小 50M
    FILEGROWTH = 5  --每次增加 5M
)
LOG ON
(
    NAME = 'AccountingLog',
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AccountingLog.ldf',
    SIZE = 5MB,
    MAXSIZE = 25MB,
    FILEGROWTH = 5MB
)

 

二、CREATE TABLE

  创建表的完整语法:

  CREATE TABLE [database_name.[owner].]table_name
  (
    <column name> <data type>
    [[DEFAULT <constant expression>] | [IDENTITY [(seed,increment) [NOT FOR REPLICATION]]]]
    [ROWGUIDCOL]
    [COLLATE <collation name>]
    [NULL|NOT NULL]      --是否允许为空
    [<column constraints>]  --列约束
    | [column_name AS compute_column_expression]
    | [<table_constraint>]  --表约束
    [,...n]
  )
  [ON{<filegroup>|DEFAULT}]
  [TEXTIMAGE_ON{<filegroup>|DEFAULT}]

  1、表名(table_name)和列名(column name)

  命名标准:

  [1] 对于名称的每个单词,要求首字母大写,而其他字母小写。

  [2] 当名称中有两个单词时,不要使用任何分隔符,通过将每个单词首字母大写来区分单词。其实关于下划线,差别不大。顺自己意愿。

  [3] 名称尽量短,但是要限制缩写,只有大家一看就看的明白的情况下才缩写。当缩写之后不容易看懂,不要缩写。

  [4] 当基于其他表来构建表时,需要在新的表名中包含所有父表的名称。如电影表Movies与演员表Stars的关系表:MovieStars。

  2、IDENTITY

  在数据库设计中,标识符就是SQL Server自动分配一个序号给插入的每个行。SQL Server开始计数的数字称为种子值,而这个值随着每行增加或减少的数量值称为增量。默认情况下种子值为1,增量为1,很多设计要求不要改动设个默认设置,不过,也可以设定种子为3,增量为5等,这种情况下,将从3开始计数,然后每次加5。得到8、13、18、23等。

  标识列必须是数值类型,在实际中,通常使用整型或大整型实现。

  标识符最常见的用法是生成一个新值作为每行的标识符,即标识列通常用于创建表的主键,但是IDENTITY与PRIMARY KEY是不同的概念,即不会因为有一个IDENTITY列就说明这个值是唯一的(例如可以重复设置种子值,使用前面用过的值)。IDENTITY值通常用于PRIMARY KEY列,但并不是必须这样使用。

  3、NOT FOR REPLICATION

  NOT FOR REPLICATION参数决定了当列发布到另一个数据库时,是为新的数据库分配一个新的标识列,还是保留已有的值。

  4、ROWGUIDCOL

  这个很像标识列,即用于唯一标识表的每行。当启用ROWGUIDCOL后,SQL Server没有采用数字技术,而是采用全局唯一标识符(Globally Unique Identifier)。这样即使将两张表的数据复制到一个表也没有问题,因此GUID在空间和时间上都是唯一的。

   5、COLLATE

  这个选项与在CREATE DATABASE命令中的作用基本一样,主要区别是作用范围,这里是在列的层次而不是数据库的层次定义的。

   6、NULL/NOT NULL

  这个选项说明指定列是否接受NULL值,在第一次安装SQL Server时,默认的列值是NOT NULL,除非指定允许为空。

  7、计算列

  可以创建一个本身没有任何数据的列,但列值是由表中其他列动态生成的。因为如果查询时指定列值,能给应该带来方便。

  具体语法如下:

  <column name> AS <computed column expression>

   示例:

  ExtendPrice AS Price * Quantity

   在上面的例子中,ExtendPrice的值是根据Price和Quantity计算得来。

  注意事项:

  1、不能使用子查询,而且值不能来自其他不同的表。

  2、可以在计算列上创建索引,但是必须采用特定的步骤。

  8、表约束

  表约束和列约束很相似,都是对可以插入表中的数据进行限制。它们之间有一点不同的是:表约束可以基于多个列。

  9、ON

  在处理数据库创建时,提到过可以创建不同的文件组,表定义中的ON子句就是用于指定希望表位于哪个文件组的一种方法。可以将给定的表放在一个特定的物理设备上,或者就按照大多数时候做的那样,省略ON子句。

  10、TEXTIMAGE_ON

  这个选项和前面讲到过的ON子句基本上相同,不同的是将该选择将表的特定部分移动到不同的文件组中。这个子句只有在表的定义中有text、ntext或image时才有效。当使用TEXTIMAGE_ON子句时,只是将BLOB信息移动到分离的文件组中--表的其他部分还在默认文件组或者ON子句选择的文件组中。

  示例:

  USE Accounting
  CREATE TABLE Customers
  {
    CustomerNo    
int       IDENTITY NOT NULL,     CostomerName   varchar(30)  NOT NULL,     Address1     varchar(30)  NOT NULL,     Address2     varchar(30)  NOT NULL,     City        varchar(20)  NOT NULL     State       char(2)    NOT NULL,     Zip        varchar(10)  NOT NULL,     Contact      varchar(25)  NOT NULL,     Phone       char(15)    NOT NULL,     FedIDNo      varchar(9)   NOT NULL,     DateInSystem   smalldatetime NOT NULL   }

  在CREATE代码前面添加USE<database name>行,这样能够确保当运行脚本时,是在所指定的数据库中创建表。

三、ALTER语句

  与CREATE语句很相似,ALTER语句的开头总有一样的:

ALTER <object type> <object name>

  1、ALTER DATABASE

  具体语法如下:

ALTER DATABASE <database name>
    ADD FILE
    ([ NAME = <'logical file name'>,] 
        FILENAME = <'file name'>
        [, SIZE = <size in KB,MB,GB or TB>]
        [, MAXSIZE = < size in KB,MB,GB or TB>]
        [, FILEGROWTH = <No of KB,MB,GB or TB | percentage>])
     [,...n][ TO FILEGROUP filegroup_name]
     [, OFFLINE]
|ADD LOG FILE
        ([ NAME = <'logical file name'>, ]
           FILENAME = <'file name'>                              
         [, SIZE = <size in KB,MB,GB or TB>]
         [, MAXSIZE = < size in KB,MB,GB or TB>]
         [, FILEGROWTH = <No of KB,MB,GB or TB | percentage>])   
         | REMOVE FILE <logical file name> [WITH DELETE]
         | ADD FILEGROUP <filegroup name>
         | REMOVE FILEGROUP <filegroup name>
         | MODIFY FILE <filespec>
         | MODIFY NAME = <new dbname>
         | MODIFY FILEGROUP <filegroup name> {<filegroup property> | NAME = <new filegroup name>}
         | SET <optionspec> [,...n][WITH <termination>]
         | COLLATE <collation name>

  示例:将数据库扩充至100MB:

    ALTER DATABASE Accounting
      MODIFY FILE
        (
            NAME = Accounting,
            SIZE = 100MB
        )

 

  2、ALTER TABLE

  具体语法:

  ALTER TABLE table_name
   {  [ALTER COLUMN <column_name>
        {[<schema of new data type>].<new_data_type>[(precision [,scale])] max | 
        <xml schema collection> [COLLATE <collation_name>][NULL | NOT NULL] | [{ADD | DROP} ROWGUIDCOL] | PERSISTED}]
        |ADD <column name> <data_type>
            [[DEFAULT <constant_expression>] | [IDENTITY [(<seed>,<increment>)[NOT FOR REPLICATION]]]]
            [ROWGUIDCOL]
            [COLLATE <collation_name>]
            [NULL | NOT NULL]
            [<column_constraints>]
            |[<column_name> AS <computed_column_expression>]
        |ADD [CONSTRAINT <constraint_name>]
            {  [{PRIMARY KEY | UNIQUE}
                [CLUSTERED | NONCLUSTERED]
                {(<column_name>[,...n])}
                [WITH FILLFACTOR = <fillfactor>]
                [ON {<filegroup> | DEFAULT}]
                ]
                |FOREIGN KEY
                    [(<column_name>[,...n])]
                    REFERENCES <referenced_table> [(<referenced_column>[,,,n])]
                    [ON DELETE {CASCADE | NO ACTION}]
                    [ON UPDATE {CASCADE | NO ACTION}]
                    [NOT FOR REPLICATION]
                    | DEFAULT <constant_expression>
                        [FOR <column_name>]
                    | CHECK [NOT FOR REPLICATOPM]
                        (<search_conditions>)
                    [,...n][,...n]
                    |[WITH CHECK|WHTH NOCHECK]
                    |{ENABLE | DISABLE } TRIGGER
                    {ALL | <trigger name> [,...n]}
            |DROP
             {[CONSTRAINT] <constraint_name>
                    |COLUMN <column_name>}[,...n]
                    |{CHECK|NOCHECK} CONSTRAING
                    {ALL|<constraint_name>[,...n]}
                |{ENABLE|DISABLE} TRIGGER
                    {ALL|<trigger_name>[,...n]}
                | SWITCH [PARTITION <source partition number expression>]
                    TO [ schema_name. ] target_table
                    [PARTITION<target partition number expression>]
            }

  下面给一些示例。

  添加一个列:

ALTER TABLE Employees
    ADD
    PreviousEmployer varchar(30) NULL

  执行以上语句后,语句是添加了,但是这些列是添加在列表的末尾,在SQL Server中没办法将列添加到特定位置。如果想将一个列移动到中间,那么需要创建一个全新的表,将数据复制到新表中,删除已有的表,然后将表重新命名。

四、DROP语句

  执行DROP语句与删除在DROP语句中引用的任何对象一样。这一操作快而简单,其语法对于所有主要的SQL Server对象(表、视图、存储过程及触发器)来说是相同的。语法如下所示:

DROP <object type> <object name> [,...n]

  以下给出一个同时删除两个表的例子:

  USE Accounting
  DROP TABLE Customer,Employess

  删除数据库的例子:

  USE master
  DROP DATABASE Accounting

  如果返回错误,数据库正在使用,不能删除的话,要检查一下两个问题。

  1、确保在Managerment Studio中的当前数据库不是要删除的数据库。

  2、确保没有打开其他显示要删除的数据库为当前数据库的连接。

 

posted on 2016-08-29 13:31  Now,DayBreak  阅读(1478)  评论(0编辑  收藏  举报