一、创建数据库
我们知道表是属于架构的,而架构又是属于数据库的。要在SQL Server环境中创建一个名为TestDB的数据库,可以运行以下代码:
IF DB_ID('TestDB') IS NULL
CREATE DATABASE TestDB;
如果不存在名为TestDB的数据库,这段代码就会创建一个新的。DB_ID函数接受一个数据库名称作为输入,返回它的内部数据库ID。如果输入名称指定的数据库不存在,这个函数将返回NULL。这是一种检查数据库是否存在的简单方法。注意:在这个简单的CREATE DATABASE语句中,采用了默认的文件设置(例如,区域和初始大小)。在产品环境中,通常应该显示指定所需要的数据库和文件的设置。
在例子中使用的架构是dbo,在每个数据库中都会自动创建这个架构。当用户没有默认架构显示关联到其他架构时,就会将这个dbo作为默认架构。
二、创建表
以下代码在TestDB数据库中创建一个名为Employees的表:
USE TestDB
IF OBJECT_ID('dbo.Employees','U') IS NOT NULL
DROP TABLE dbo.Employees;
CREATE TABLE dbo.Employees
(
empid INT NOT NULL,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
hiredate DATETIME NOT NULL,
mgrid INT NULL,
ssn VARCHAR(20) NOT NULL,
salary MONEY NOT NULL
);
USE语句将当前的数据库上下文切换为TestDB。在创建对象的脚本中加入USE语句,它的重要作用是确保要在正确的数据库中创建对象。
IF语句调用调用OBJECT_ID函数来检查当前数据库中是否已经存在Employees表。OBJECT_ID函数接受一个对象名称和类型作为它的输入。这里,类型'U'代表用户表。如果匹配给定输入名称和类型的对象存在,这个函数就会返回内部的对象ID,否则返回NULL。如果该函数返回NULL,就可以知道检查的数据库对象是不存在的。在这个例子中,如果Employees表已经存在,代码就先删除(DROP)这个表,接着再创建一个新的。当然,也能够选择不同的处理办法,例如,当Employees表已经存在时,可以简单地不创建这个对象。
CREATE TABLE语句负责定义前面提到的关系的主题。在这个语句中先指定表的名称,接着在圆括号中定义它的各个属性(列)。注意表名使用了两部分组成的名称dbo.Employees。如果省略了架构名称,SQL Server将使用与运行这段代码的数据库用户相关联的默认架构。
对于表的每个属性,需要指定它的属性名称、数据类型和是否允许NULL数据值。在Employees表中,empid(雇员ID)和mgrid(经理ID)定义为INT(4字节的整数类型);firstname、lastname和ssn(社会保险号,social security number)定义为VARCHAR(可变长长度的字符串类型,指定最多支持的字符个数);hiredate定义为DATETIME,在SQL Server 2008中可以定义为DATE,DATE数据类型是SQL Server 2008新增的,salary定义为MONEY。
如果不显示指定一个列是否允许NULL值,SQL Server则采用默认值。ANSI规定:如果不指定一个列是否允许NULL值,则假设应该是NULL(允许NULL值)。但SQL Server提供了一些设置可以改变这一默认行为。我们强烈推荐在这种情况下要显示指定设置,不要依赖其默认值。而且,也强烈推荐将列定义为NOT NULL,除非有明显的原因而需要支持NULL。即使认为一个列不允许NULL值,但没有用NOT NULL约束加以限制时,NULL值仍然可以插入这个列中。在Employees表中,除了mgrid列,其他所有列都定义为NOT NULL。mgrid属性为NULL值表示雇员没有经理,例如企业的CEO这种情况。