数据库的移植操作
数据库的移植操作
为什么要学习数据库移植
-
因为数据库在服务运行状态下无法复制、移动、发送
2.在必要情况下我们必须对目标数据库进行合法的移植操作
关闭MSSQLSERVER服务的方式
-
如果直接关闭服务(相当于直接关闭服务器),会对正在运行的项目造成威胁
推荐使用以下方式:
注意:在数据库移植之前必须要明确目标数据库物理文件所在位置
数据库脱机联机
使服务器中的目标数据库的状态改变为“罢工”状态
实现数据库脱机的具体操作步骤如下:
表明脱机成功
脱机的数据库相当似于数据库物理文件依然在服务器上存在,只是出于“罢工”,因此DBMS无法正常管理脱机状态下数据库
如果要回复DBMS的正常管理,则必须对数据库进行联机操作
实现数据库联机的具体操作步骤如下:
在联机时必须要保证目标数据库物理文件,在脱机之前正常运行时所在的路径下否则联机失败
数据库分离附加
附加有前提是:要考虑附加的目标数据库原始版本和当前服务器上数据库版本要能够融合
分离数据库不是删除数据库,它只是将数据库从服务器中分离(单独踢开)出去
分离成功之后在DBMS数据库列表中再也找不到目标数据库,所以在分离之前务必搞清楚数据库物理文件所在位置
数据库附加操作步骤:
在附加时如果数据库的日志文件也存在则自动附加,如果没有在点确定附加,附加成功之后自动创建
生成数据库脚本
针对于目标数据库版本和当前服务器数据库版本不兼容情况下,附加不成功可以采取生成数据库脚本,然后在当前服务器数据库管理工具中执行即可完成数据库的重新创建
一般情况下在学习过程中用不到,前提是能够对目标数据库服务器能够进行数据库管理操作才可用
数据表的创建
使用企业管理器创建
使用查询分析器创建
*注意:凡是使用查询分析器进行数据库管理操作,首先要注意明确当前正处于查询分析器工作的收据库是哪个数据库
新建的查询分析器一般默认是位master系统数据库服务的,基本上在需要使用SQL代码创建数据库时才使用master数据库
--为了保险起见先将数据库切换到目标数据库
USE InLettManager
--相当于C#中的分号作用,SQL代码执行是需要批量操作,而GO关键字是SQL代码批量的一个标识符
GO
--创建数据表
CREATE TABLE Teacher
(
--创建数据表中的字段
TID INT,
NAME NVARCHAR(20),
AGE INT,
Class NVARCHAR(20)
)
GO
SQL代码的命名规则
-
避开SQL系统代码中的关键字
-
数据表、约束、字段等命名规范一般以帕斯卡命名法为主
-
建议不要使用特殊符号,在SQL中一般使用的符号是"_"
-
如果必须使用SQL系统关键字则给关键字带上"[ ]"
SQL数据类型
-
整数类型
bigint:占8个字节,相当于C#中long
int:占4个字节,相当于C#中的int
smallint:占2个字节,相当于C#中的short
tinyint:占1个字节,相当于C#中的byte
-
精确数字类型
decimal:固定精确度 -10^38--10^38-1
numeric:功能等同于decimal
写法:decimal(整数,小数),numeric(整数,小数)
默认:整数18位,小数0位
-
近似数字(浮点)类型
float[(n)]:表示范围:1.79乘以10的308次幂
n:表示精度,有效值1-53之间
real:知道即可
-
文本类型,在SQL中文本类型赋值必须使用单引号
char:固定长度的非unicode字符数据,最大长度是8000个字符
varchar:可变长度的非unicode字符数据,最大长度是8000个字符
text:存储长文本信息,最大长度为2^32-1个字符
nchar:固定长度的unicode字符数据,最大长度是4000个字符
nvarchar:可变长度的unicode字符数据,最大长度是4000个字符
ntext:存储可变的长文本信息,最大长度为2^30-1个字符
固定:当声明数据类型设置了固定长度,那么这个数据类型赋值的字符长度绝对不能超过这个规定,如果赋值的数据长度不足规定的长度,使用空格字符填充
可变:如果赋值数据长度不足,则自动缩短为实际赋值数据长度,内存空间按照指定大小,如果超过指定长度则依然按照实际赋值数据长度,内存空间跟着改变
类型长度最终影响的是内存空间
-
日期时间类型
datetime:允许范围1753-1-1至9999-1-1
smalldatetime:允许范围1900-1-1至2079-1-1
时间精度不同:datetime精确到3/100秒;smalldatetime精确到1分钟
赋值格式:以字符串格式填写
分隔符数字方式:2020-02-18或2020/02/18或02/18/2020
纯数字格式:02182020 月日年
英文数字方式:Feb 18,2020
不管哪种方式给日期时间类型赋值必须用单引号(' ')
一月 Jan.。二月 Feb.。三月 Mar.。四月 Apr.。五月 May.。六月 Jun.。七月 Jul.。八月 Aug.。九月 Sept.。十月 Oct.。十一月 Nov.。十二月 Dec.。
-
位类型
bit:表示“是/否”类型数据。(0/1,true/false)
-
货币类型
money:货币数-2^63-2^63-1之间,精确到货币单位的千分之一
smallmoney:货币数介于-214748.3648 -- 214748.3648之间,精确到货币单位的百分之一
-
二进制类型
binary:固定长度的二进制数据,最大长度为8000个字节
vbinary:可变长度的二进制数据,最大长度为8000个字节
image:可变长度的二进制数据,最大长度2^31个字节,应用场合:可用来存储图片类型
数据表的完整性
实体完整性
每个表中有一个必须要指定的字段,主要依赖主键约束
区域完整性
针对表中的某个字段进行特殊化限制,主要依赖剩余的约束
参照完整性
表与表之间的一种特殊化关联限制,主要依靠外键约束
维护数据表的完整性
什么是约束:使用约束、键的作用来维护数据表的完整性
约束有哪些:
-
自增约束
-
非空约束
-
检查约束
-
默认约束
-
唯一约束
-
主键约束
-
外键约束
一般在设置列特征的时候都是提前在数据库设计时需要考虑明确,约束都是在数据库设计时必须考虑明确的
数据表的特征
已知创建数据表的语法是
CREATE TABLE 表名
(
字段1 数据类型 列的特征,
字段2 数据类型 列的特征,
......
)
列特征包含的内容有:
-
是否可以为空(NULL):在输入数据的时候,如果这个列允许为空则可以不用填写,否则必须为该列填写对应的数据内容
-
是否是标识列(自动编号)
-
是否有默认值:如果数据表的某一列在用户不主动输入数据的时候,希望能够提供一个默认的内容
Adrress NVARCHAR(20) DEFAULT('地址不详'),
-
是否为主键:主键是实体的唯一标识,保证实体不被重复记录,一个数据表必须有主键才能进行更新、删除指定的实体
[TID] INT IDENTITY(10000,1) primary key,
-
是否有检查设置:如果数据表的某一列具有检查限制,当用户为这一列添加数据时,必须要保证添加的数据满足检查限制的要求
如果添加数据违反检查特征:
Age INT CHECK(Age>=18), Sex nvarchar(2) CHECK(SEX='男' or SEX='女'),
-
是否有唯一设置:如果这一列具有唯一设置,那么必须保证在给这一列添加数据时,所添加的数据在这一列中是绝对唯一的存在
Class NVARCHAR(20) UNIQUE
如果添加数据违反唯一特征:
- 是否有外键特征:如果该列具有外键约束,那么在向该列添加数据时必须要按照外键的目标数据表中已有的数据去填写,外键指向的数据表的字段必须是一个主键
如果数据违反外键约束
如果当前数据表被其他数据表以外键约束,如果要删除当前数据表中的数据则需要慎重考虑,有可能删除失败
标识列
标识列使用的意义
例如全中国有14亿人,名字叫“张三”的共有500个,此时如果找特定的张三非常困难,所以中国每个合法公民都有一张身份证,ID是14亿中唯一的
SQLServer中提供了一种标识列,也叫作“自增编号”,它自身可能不具有任何意义,但是我们可以规定标识列具有特定的意义,例如QQ:10000
标识列如何使用
-
该列必须是整数类型,或者也可以是没有小数部分的精确类型
-
标识种子:标识列的起始值
-
标识增量:标识列每次递增的值(自动增加的值)
--如果将TID列设为标识列,则该列数据类型必须为整数,使用IDENTITY关键字,小括号中第一个参数是标识种子,第二个参数是标识增量 [TID] INT IDENTITY(10000,1),
注意问题
-
有标识列的数据表被删除某一行时,数据库会将这一行空缺出来不会填补
-
标识列由系统自动维护,用户既不能自己输入数据,也不能自己修改数据
-
标识列可以同时定义为主键,也可以不定以为主键,根据数据库设计决定