SqlServer创建数据库和数据表+数据库的分离和附加
知识1:数据库分类
知识2:数据库的文件组成:数据库文件+日志文件
.mdf(主数据文件)
.ndf(次数据文件)
.ldf(日志文件)
一个数据库必须,且只能包含一个mdf,ndf和ldf可以有多个
一,创建数据库
创建数据库的代码:
--指向当前要使用的数据库,告诉master我要创建数据库了 --master是数据库的数据库 use master go --go代表前面是一个完整的过程,代表结束 if exists(select * from sysdatabases where name='StudentManageDB') drop database StudentManageDB go --创建数据库 create database StudentManageDB on primary --必须用小括号() ( --数据库文件的逻辑名(数据库管理系统用的,必须唯一,数据库内部使用的,不重复就行) name='StudentManageDB_data',--写完要用逗号 --数据库的物理文件名(绝对路径) filename='D:\DB\StudentManageDB_data.mdf',--主数据文件 --数据文件初始大小 size=20MB,--实际开发中,请根据需要设置合理的大小 --数据文件增长量 (建议不要指望这个增长,如果不断的扩充,会让数据库的性能下降) filegrowth=5MB --filegrowth=20%,也可以是一个百分比 ) , ( name='StudentManageDB_data1', --用到字符串的是单引号 filename='D:\DB\StudentManageDB_data1.ndf',--次要数据文件 size=20MB, filegrowth=5MB ) --创建日志文件 log on ( name='StudentManageDB_log', filename='D:\DB\StudentManageDB_log.ldf',--日志文件 size=20MB, filegrowth=5MB ), ( name='StudentManageDB_log1', filename='D:\DB\StudentManageDB_log1.ldf',--日志文件 size=20MB, filegrowth=5MB ) go--go代表前面是一个完整的过程,代表结束
删除数据库的方法,特别注意:
二,创建数据表
创建数据表的代码:
--创建数据表:建议,我们最好要给数据做统一的规范命名(建议大家使用Pascal命名法) use StudentManageDB --要引用这个数据库 go --创建班级表 if exists(select * from sysobjects where name='StudentClass')--查询是否存在这个数据表 drop table StudentClass go create table StudentClass ( ClassId int primary key, --列的规范:列的名称 数据类型 各种约束 ClassName varchar(20) not null ) go --创建学生表 if exists(select * from sysobjects where name='Students') drop table Students go create table Students ( StudentId int identity(100000,1) primary key,--identity(100000,1)学号从10000开始,每次递增1 StudentName varchar(20) not null, --每个人的姓名不超过10个中文,所以varchar(20) ,非空 Gender char(2) check(Gender='男' or Gender='女'), --check检查约束 char:固定的字符长度的数据(男或女,一个中文字符占2个字节是固定的) DateOfBirth datetime not null ,--(Birthday) ,datetime:日期类型,格式:2020-02-20或02/20/2020 ,日期在使用的时候要用单引号括起来('') StudentIdNo numeric(18,0) check(len(StudentIdNo)=18) unique, --unique是唯一约束,身份证要求唯一,numeric(18,0)代表18位的整数,第二个参数0代表没有小数,如是numeric(18,2)代表保留2位小数 --check(len(StudentIdNo)=18) 固定长度约束 --StudentIdNo char(18) check(len(StudentIdNo)=18) unique, --实际应用中,使用char(18),因为身份证号有字母 Age int check(age>18 and age<35), --检查约束 PhoneNumber varchar(50) , StudentAddress nvarchar(200) default('地址不详'), --default是默认约束 varchar:可变长度的字符数据,因为地址是可变长度的 ClassId int references StudentClass(ClassId) --外键约束,要求:列的数据类型和长度和主键表对应字段必须一致。references外键表(主表的字段) ) go --创建管理员用户表 if exists(select * from sysobjects where name='Admins') drop table Admins go create table Admins ( LoginId int identity(1000,1) primary key, LoginPwd varchar(20) not null, AdminName varchar(20) not null ) go --创建成绩表 if exists(select * from sysobjects where name='ScoreList') drop table ScoreList go create table ScoreList ( Id int identity(1,1) primary key, StudentId int references Students(StudentId), CSharp int null, --成绩 SQLServerDB int null, --成绩 UpdateTime datetime default(getdate()) ) go --print getdate() --打印结果:04 6 2020 10:07PM
三,添加约束(创建表的时候没有加约束,再单独添加约束,一般不建议这样使用)
添加约束的代码:
use StudentManageDB go --添加相关约束 --创建主键约束 if exists(select * from sysobjects where name='pk_StudentId') alter table Students drop constraint pk_StudentId --pk_StudentId这个名字可以随便写的,为了规范,主键以pk开头 --为StudentId字段添加约束 alter table Students add constraint pk_StudentId primary key(StudentId) --创建唯一约束 if exists(select * from sysobjects where name='uq_StudentIdNo') alter table Students drop constraint uq_StudentIdNo --uq_StudentIdNo这个名字可以随便写的,为了规范,唯一以uq开头 --为StudentIdNo字段添加约束 alter table Students add constraint uq_StudentIdNo primary key(StudentIdNo) --创建检查约束(年龄范围) if exists(select * from sysobjects where name='ck_Age') alter table Students drop constraint ck_Age --为Age字段添加检查约束 alter table Students add constraint ck_Age check(Age between 18 and 25) --创建检查约束(电话号码长度) if exists(select * from sysobjects where name='ck_PhoneNumber') alter table Students drop constraint ck_PhoneNumber alter table Students add constraint ck_PhoneNumber check(len(PhoneNumber)=11) --添加外键约束 if exists(select * from sysobjects where name='fk_ClassId') alter table Students drop constraint fk_ClassId alter table Students add constraint fk_ClassId foreign key (ClassId) references StudentClass(ClassId)-- references主键表StudentClass的ClassId字段
四,数据库的分离和附加
分离数据库:将正在使用的数据库文件解除服务的限制,分离了以后就是一个普通的文件,可以随便复制和移动了
附加数据库:将指定位置的数据库文件加入到数据库服务中并运行,附加后就可以正常的DBMS操作数据了
1,分离方法:
2,附加方法:
五,附加数据库报错
这个问题一般都是因为附加的数据库物理文件所在的文件夹限制访问导致的
找到该物理文件所在的文件夹,然后右键属性-安全,点击编辑
点击添加
输入everyone,点击确定
给everyone分配完全控制的权限