数据定义语句,是用于描述数据库中要存储的现实世界实体的语言。作为数据库管理系统的一部分,DDL用于定义数据库的所有特性和属性,例如行布局、字段定义、文件位置,常见的数据定义语句有:CREATE DATABASE、CREATE TABLE、CREATE VIEW、DROP VIEW、ALTER TABLE等,下面将分别介绍各种数据定义语句。
作为数据库操作语言中非常重要的部分,CREATE用于创建数据库、数据表以及约束等,下面将详细介绍CREATE的具体应用。
创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理,创建数据库时需要指定数据库的名称、文件名、数据文件大小、初始大小、是否自动增长等内容。在SQL Server中可以使用CREATE DATABASE语句创建数据库,也可以通过对象资源管理创建数据库。这里主要介绍CREATE DATABASE的用法。CREAETE DATABASE语句的基本语法格式如下:
·database_name:数据库的名称,不能与SQL Server中现有的数据库实例名称相冲突,数据库的名称中最多可以包含128个字符。
·ON:指定用来存储数据库中数据的磁盘文件。
·PRIMARY:指定关联的<filespec>列表定义的主文件,在主文件组<filespec>项中指定的第一个文件将生成主文件,一个数据库只能有一个主文件。如果没有指定PRIMARY,那么CREATE DATABASE语句中列出的第一个文件将成为主文件。
·LOG ON:指定用来存储数据库日志的日志文件。LOG ON后跟以逗号分隔的用以定义日志文件的<filespec>项列表。如果没有指定LOG ON,将自动创建一个日志文件,其大小为该数据库的所有数据文件大小总和的25%或512KB,取两者之中的较大者。
·NAME:指定文件的逻辑名称。引用文件时在SQL Server中使用的逻辑名称。
·FILENAME:指定创建文件时由操作系统使用的路径和文件名,执行CREATE DATABASE语句前,指定路径必须存在。
·SIZE:指定数据库文件的初始大小,如果没有为主文件提供size的值,那么数据库引擎将使用model数据库中的主文件的大小。
·MAXSIZE:指定文件可增大到的最大大小(即容量)。可以使用KB、MB、GB和TB作为后缀来指定容量单位,默认容量单位为MB。max_size是整数值。如果不指定max_size,则文件将不断增长直至整个磁盘被占满。UNLIMITED表示文件一直增长到磁盘被占满。
·FILEGROWTH:指定文件的自动增量。文件的FILEGROWTH设置不能超过MAXSIZE设置。该值可以用MB、KB、GB、TB或%来指定容量单位。默认容量单位为MB。如果指定为%,则表示增量大小按文件大小的百分比增量来计算。值为0时,表明自动增长被设置为关闭,不允许增加额外的存储空间。
【例5.1】创建名为test_db的数据库,输入如下语句:
CREATE DATABASE test_db ON PRIMARY ( NAME = test_db_data1, --数据库逻辑文件名称 FILENAME ='C:\SQL Server 2019\test_db_data.mdf', --主数据文件的存储位置 SIZE = 5120KB , --主数据文件大的小 MAXSIZE =20, --主数据文件最大可增长到为20MB FILEGROWTH =1 --文件增长大小设置为1MB )
该段程序代码创建一个名为test_db的数据库,数据库的主数据文件名设置为test_db_data1,主数据文件大小为5MB,增长大小为1MB;注意,该段程序代码没有指定创建事务日志文件,但是系统默认会创建一个以数据库名加上_log作为文件名的日志文件,该日志文件的大小为系统默认值2MB,增量为10%,因为没有设置增长限制,所以事务日志文件的最大增长空间将是指定磁盘上所有剩余的可用存储空间。
在创建完数据库之后,接下来的工作就是创建数据表。所谓创建数据表,就在已经创建好了的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性约束的过程。创建数据表使用CREATE TABLE语句,CREATE TABLE语句的基本语法格式如下:
CREATE TABLE [database_name.[ schema_name ].] table_name {column_name <data_type> [ NULL | NOT NULL ] | [ DEFAULT constant_expression ] | [ ROWGUIDCOL ] { PRIMARY KEY | UNIQUE } [CLUSTERED | NONCLUSTERED] [ ASC | DESC ] }[ ,...n ]
·database_name:指定要在其中创建数据表的数据库(通过数据库名来指定),不指定数据库时,则默认使用当前数据库。
·schema_name:指定新数据表所属架构(通过架构名来指定),若此项为空,则默认为新表的创建者在当前架构。
·table_name:指定要创建的数据表(通过数据表名来指定)。
·column_name:数据表中各个列的名称,列名必须唯一。
·data_type:指定字段的数据类型,可以是系统数据类型,也可以是用户自定义的数据类型。
·NULL | NOT NULL:确定列中是否允许使用空值。
·DEFAULT:用于指定列的默认值。
·ROWGUIDCOL:指示新列是行GUID列。对于每个数据表,只能将其中的一个uniqueidentifier列指定为ROWGUIDCOL列。
·PRIMARY KEY:主键约束,每个数据表只能创建一个主键约束。主键约束中定义的所有列都必须定义为NOT NULL,即非空。
·UNIQUE:唯一性约束,该约束通过唯一索引为一个或多个指定列提供实体完整性。一个数据表可以有多个唯一性约束。
·CLUSTERED | NONCLUSTERED:指示为主键约束或唯一性约束创建聚集索引还是非聚集索引。主键约束默认为CLUSTERED,唯一性约束默认为NONCLUSTERED。在CREATE TABLE语句中,只可为一个约束指定CLUSTERED。如果在唯一性约束指定CLUSTERED的同时又指定了主键约束,则主键约束将默认为NONCLUSTERED。
·[ ASC | DESC ]:指定加入到数据表约束中的一列或多列的排列顺序,ASC为升序排列,DESC为降序排列,默认值为ASC。
【例5.2】在test_db数据库中创建员工表tb_emp1,结构如表5-1所示。
表5-1 tb_emp1表结构
输入如下语句:
USE test_db CREATE TABLE tb_emp1 ( id INT PRIMARY KEY, name VARCHAR(25) NOT NULL, deptId CHAR(2) NOT NULL, salary SMALLMONEY NULL );
该段程序代码将在test_db数据库中添加一个名为tb_emp1的数据表。读者可以打开表设计窗口,即可看到该表的结构,如图5-1所示。
图5-1 查看tb_emp1数据表的表结构
既然能够创建数据库和数据表,那么也能将其删除,DROP语句可以轻松地删除数据库和数据表。下面介绍如何使用DROP语句。
删除数据表是将数据库中已经存在的表从数据库中删除。注意,删除表的同时,表的定义和表中数据、索引和视图也会被删除,因此,在删除操作前,最好对表中的数据做个备份,以免造成无法挽回的后果(如果要删除的表是其他表的参照表,此表将无法删除,需要先删除表中的外键约束或者将其他表删除)。删除表的语法格式如下:
DROP TABLE table_name
table_name用于指定要删除的数据表。
【例5.3】删除test_db数据库中的table_emp表,输入如下语句:
USE test_db GO DROP TABLE dbo.table_emp
删除数据库是将已经存在的数据库从磁盘空间上清除,清除之后,数据库中的所有数据也将一同被删除,删除数据库的基本语法格式为:
DROP DATABASE database_name
database_name用于指定要删除的数据库。
【例5.4】删除test_db数据库,输入如下语句:
DROP DATABASE test_db
用户可以使用ALTER语句对数据库和数据表进行修改,下面将介绍如何使用ALTER语句修改数据库和数据表。
修改数据库可以使用ALTER DATABASE语句,其基本语法格式如下:
·database_name:指定要修改的数据库。
·ADD FILE…TO FILEGROUP:添加新数据库文件到指定的文件组中。
·ADD LOG FILE:添加日志文件。
·REMOVE FILE:从SQL Server的实例中删除逻辑文件说明并删除物理文件。除非文件为空,否则无法删除文件。
·MODIFYFILE:指定应修改的文件。一次只能更改一个<filespec>属性。必须在<filespec>属性中指定NAME,以标识要修改的文件。如果指定了SIZE,那么新大小必须比文件当前大小要大。
·MODIFY NAME :使用指定的名称重命名数据库。
·ADD FILEGROUP:向数据库中添加文件组。
·REMOVE FILEGROUP:从数据库中删除文件组。除非文件组为空,否则无法将该文件组删除。
·MODIFY FILEGROUP:通过将状态设置为READ_ONLY或READ_WRITE,将文件组设置为数据库的默认文件组或者通过更改文件组名称来修改文件组。
【例5.5】将test_db数据库的名称修改为company,输入如下语句:
ALTER DATABASE test_db MODIFY NAME=company
修改表结构可以在已经定义的表中增加新的字段或删除多余的字段。实现这些操作可以使用ALTER TABLE语句,其基本语法格式如下:
ALTER TABLE [ database_name . [ schema_name ] . ] table_name { ALTER { [COLUMN column_name type_name [column_constraints] ] [,……n] } | ADD { [ column_name1 typename [column_constraints],[table_constraint] ] [, ……n] } | DROP { [COLUMN column_name1] [, ……n] } }
·ALTER:修改字段属性。
·ADD:表示向数据表中添加新的字段,后面可以跟多个字段的定义信息,多个字段之间使用逗号隔开。
·DROP:删除数据表中的字段,可以同时删除多个字段,多个字段之间使用逗号隔开。
【例5.6】在更改过名称的company数据库中,向tb_emp1数据表中添加名为birth的字段,数据类型为date,并要求为非空,输入如下语句:
USE company GO ALTER TABLE tb_emp1 ADD birth DATE NOT NULL
【例5.7】删除tb_emp1表中的birth字段,输入如下语句:
USE company GO ALTER TABLE tb_emp1 DROP COLUMN birth