1.1 SQL Server 2008实例
SQL Server实例是指安装的一个SQL Server数据库引擎/服务。在同一台计算机上可以安装SQL Server的多个实例,从安全性,实例管理的数据以及其他方面来说,每个实例之间是彼此独立的。
可以将计算机上安装的实例之一设置为默认实例,而其他实例则必须为命名实例。
在安装期间中可以决定是将一个实例安装为默认实例,还是命名实例,但安装好后就不能对此进行修改了!
客户端应用程序连接默认实例: 计算机名(IP地址)
客户端应用程序连接命名实例: 计算机名(IP地址) / 实例名称(安装期间提供)
1.2数据库
可以认为数据库是各种对象的容器,这些对象可以是:表,视图,存储过程等等。每个SQL Server实例可以包含多个数据库。
安装SQL Server时安装程序会创建几个系统数据库,用于保存系统数据和服务于内部目的。
1.2.1系统数据库
master : 保存实例范围内的元数据信息,服务器配置,实例中所有数据库的信息,以及初始化信息。
resource : 是SQL Server 2005新增的,用于保存所有系统对象。当查询数据库中的元数据信息时,这种信息表面上是位于数据库中的,但实际上是保存在resource数据库中的。
model : 是新数据库的模板,每个新创建的数据库最初都是model的一个副本(Copy)。
tempdb : 是保存临时数据的地方。每次重新启动SQL Server实例时,会删除这个数据库 的内容,并将其创建为model 的一个副本。
msdb : 是称为SQL Server Agent的一种服务保存其数据的地方。
1.2.2登陆验证
从安全性方面,为了能连接到SQL Server实例,必须让DBA位用户创建一个登陆账号。登陆账号可以关联到Windows凭据(credentials),在这种情况下,它会调用Windows凭据进行身份验证。
当使用SQL Server验证登陆来连接SQL Server实例时,就必须提供登陆的用户名和密码。
1.2.3物理布局
数据库在物理上是由数据文件和事务日志文件组成。
每个数据库必须至少有一个数据文件和一个日志文件(SQL Server的默认情况),数据文件用于保存数据库对象数据,事务日志文件则保存SQL Server为了维护事务所需的信息
.mdf 代表Master Data File(主要数据文件)。
.ldf 代表Log Data File(日志数据文件)
.ndf 代表Not Master Data File(辅助数据文件)
1.2.4 架构和对象
一个数据库包含多个架构,而每个架构则又包含多个对象(表,视图,存储过程等)。
架构一个命名空间,用作对象名称的前缀。例如,在架构Sales中有一个Order表,架构限定(schema-qualified)的对象名称是Sales.Order。如果在引用对象时忽略了架构名称,SQL Server将按照一定的策略分析出架构的名称是什么。
如果不显式的指定架构,那么在解析对象名称时就会付出一定的没有意义的额外代价。所以在代码中引用对象时,总是推荐使用这种架构限定的对象名称(两部分对象名称)。
1.3 创建表和定义数据完整性
示例1:创建数据库
IF DB_ID ( 'testdb' ) IS NULL
CREATE DATABASE testdb ;
(1)检查数据库是否存在?
DB_ID函数接受一个数据库名称作为输入参数,返回它的内部数据库ID。如果指定名称的数据库还不存在,则返回NULL
(2)架构?
这个例子使用的架构是dbo(默认架构),在每个数据库中都会自动创建这个架构。
1.3.1创建表
示例2:创建表
USE testdb ;
IF OBJECT_ID( 'dbo.Employees' ,'U' ) IS NULL
DROP TABLE dbo.Employees ;
CREATE TABLE dbo.Employees
(
empid INT NOT NULL,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
hiredate DATE NOT NULL,
mgrid INT NOT NULL,
ssn VARCHAR(2) NOT NULL,
salary MONEY NOT NULL
) ;
【示例分析】
(1)USE 语句将当前的数据库上下文切换为dbo.testdb。以确保在正确的数据库中创建对象。
(2)OBJECT_ID函数接受一个对象名称和类型作为输入,这里,类型 ' U '代表用户表。如果匹配给定输入名称和类型的对象存在,这个函数则返回内部的对象ID,否则返回NULL。
(3)CREATE TABLE 先指定要创建的表的名称(架构限定名),然后再在圆括号中定义它的各个属性(列)。
【ANSI标准】
如果不显式指定一个列是否允许NULL值,则假设应该是NULL值(允许NULL值)。
【最佳实践】
将列定义为为NOT NULL
采用分号结束所有语句
1.3.2定义完整性约束
(1)Primary Key Constraints
主键约束实施行的唯一约束,同时不允许受约束的属性(列)取NULL值。
每个表只能定义一个主键.
ALTER TABLE dbo.Employees
ADD CONSTRAINT PK_Employees
PRIMARY KEY(empid);
定义好主键约束后,就可以保证所有的empid的值是唯一而确定的。
(2)Unique Constraints
唯一约束用来保证数据行的一个列(一组列)数据的唯一。
在同一个表中可以定义多个唯一约束。
ALTER TABLE dbo.Employees
ADD CONSTRAINT UNQ_Employees_ssn
UNIQUE(ssn);
(3)Foreign Key Constraints
外键约束用于实施引用完整性。这种约束在引用表(referencing table)的一组属性上进行定义,并指向被引用表(referenced table)中的一组候选键(主键或唯一约束)。注意,引用表和被引用表可能是同一个表!
外键的目的是将外键列允许的值域限制为被引用列中现有的那些值。
示例3:创建表Order,其主键定义在orderid上
IF OBJECT_ID('dbo.Orders','U') is NOT NULL
DROP TABLE dbo.Orders;
CREATE TABLE dbo.Orders
(
orderid INT NOT NULL,
empid INT NOT NULL,
custid VARCHAR(20) NOT NULL,
orderts DATETIME NOT NULL,
qty INT NOT NULL,
CONSTRAINT PK_Orders
PRIMARY KEY(orderid)
);
如果现在要想实施一个完整性规则,将Orders表的empid列支持的值域限制为现有的Employees表中empid列的取值。为此,要在Orders表的empid上定义一个外键约束,让他指向Employees表的empid列。
ALTER TABLE dbo.Orders
ADD CONSTRAINT FK_Orders_Employees
FOREIGN KEY(empid) REFERENCES dbo.Employees(empid);
类似的,想要限制Employees表中mgrid列支持的值域为同一个表中已经存在的那些empid的值。
ALTER TABLE dbo.Employees
ADD CONSTRAINT FK_Employees_Employees
FOREIGN KEY(mgrid)
REFERENCES dbo.Employees(empid);
注意,既是被引用的候选键列不存在NULL值,在外键列中也允许NULL列。
【禁止操作】
当试图删除被引用表中的行,或更新被引用的候选键时,如果在引用表中存在相关的行,则操作不能执行!
【级联操作】
可以在外键定义中将ON DELETE和ON UPDATE选项定义为:
CASCADE : 操作(更新和删除)将被级联到引用表中相关的行。
SET DEFAULT : 补偿操作将会把相关行的外键属性设置为列的默认值。
SET NULL : 补偿操作将会把相关行的外键属性设置为NULL值。
转自博客园张念http://www.cnblogs.com/zhangnian88123/archive/2010/01/25/1655863.html