数据库的创建和操作
创建和操作数据库
1.创建数据库的基本要求
【1】主数据文件:一个数据库有,且只能有一个。扩展名是.mdf。
【2】次要数据文件:可以根据需要添加多个,并且可以分布在不同的磁盘上。扩展名.ndf。
【3】日志文件:有且至少有一个日志文件,也可以多个。扩展名是.ldf。
2.数据库创建要思考的问题
【1】数据容量:根据需要预估。
【2】文件分布:根据容量大小,创建不同次要数据文件。分布存储。
3.基于T-SQL脚本创建数据库实例
use master--表示当前我们要在master数据库中操作 go --表示批处理结束,这个go非常重要,在必要的地方必须写,在不需要的地方,绝对不能写。 --我们在开发阶段,通会使用这种判断,查看数据库是否存在。因为我们会经常改动.如果数据库创建完毕,千万注意! if exists(select * from sysdatabases where name=‘CourseManageDB‘) drop database CourseManageDB go --创建数据库 create database CourseManageDB on primary ( --数据库的逻辑文件名(系统使用的必须唯一,但是我们看不见) name=‘CourseManageDB_data‘, --数据库物理文件名(这个是给操作系统用的,用来读取数据文件的) filename=‘D:\SQLServer\DB\CourseManageDB_data.mdf‘, --主数据文件名 --数据库文件初始大小(要根据实际的生产需求来定) size=20MB, --数据文件增量(也要参考文件本身大小) filegrowth=5MB ) , ( name=‘CourseManageDB_data1‘, filename=‘D:\SQLServer\DB\CourseManageDB_data1.ndf‘, size=20MB, filegrowth=5MB ) , ( name=‘CourseManageDB_log1‘, filename=‘D:\SQLServer\DB\CourseManageDB_log1.ldf‘, size=20MB, filegrowth=5MB ) go
4.基于T-SQL脚本创建数据表
数据表创建的要求
第一,必须规范命名(按照C#的名称规范设计)
第二,数据表必须要有主键(不建议用联合主键),因为数据默认物理存储就是按照主键排列的。
第三,数据表字段,可以根据需求添加约束,防止不合理的数据加入。
【1】主键约束:要求这个表中这个字段,必须是非空,唯一的。
不建议:组合主键
【2】检查约束:Check(约束条件),非常具有灵活性,让用户可以根据自己的需求对当前字段添加要求。
通常会用到相关的SQL的函数。
【3】唯一约束:也就是要求当前字段的数据,必须是唯一的,不能重复。
提醒:数据库的约束,是对数据保障的一个方法,他不是万能的,我们不要在数据库创建阶段,把约束添加的过多。
【4】默认约束:default 也就是在用户添加数据的时候,如果没有给这个值,会默认提供。
标识列:是一种自动增长列,要求我们给定标识列的种子和增长量。数据库会自动的按照这个要求,生成数据。
Identity(标识种子,增量)标识种子:在数据库设计的时候,通常会有划分。
要求:统一规划,增量一般都是以1为单位。
特点:标识列仅仅是为了唯一的区分而生成的,没有什么特别的意义。但是我们可以让他有意义。比如我们做主键,就非常好用。
贴别注意:我们不能给标识列,显式的赋值。标识列通常回合主键列一起使用。
【5】外来约束:
概念:就是说某一个数据表的一个列,是引用了其他数据表的主键。这个键就是外键列。
使用原因:如果我们没有外键,你会发现,数据表中,某些列会出现重复,而一致性被破坏。比如,我们的课程信息表中额课程分类
如果没有单独的课程分类表。那么在课程信息表中,课程分类表会有重复。而且,会在课程信息表没有的时候,分类也不存在
删除的时候,也会出现课程分类对是的问题。
例如:
1000 .NET高级VIP 重要讲解高级开发 300 .NET编程
1001 .NET全栈VIP 主要从基础到高级 300 .NET编程
1002 .NET上位机VIP 讲解工控控制系统 300 工控系列
以上数据,我们发现在添加,删除,修改都会出现问题!所以我们必须把它独立出去。
主键(主键表-->课程分类表)
10 .NET编程
11 工控系列
12 java系列
外键(这一列数据,必须在主键表中存在)
1000 .NET高级VIP 主要讲解高级开发 300 10
1001 .NET全栈VIP 主要从基础到高级 300 10
1002 .NET上位机VIP 讲解工控控制系统 200 11
1003 .NET运动控制VIP 讲解设备运动控制 200 13(因为13不在主键表中,所以这条数据是添加不进去的)
外键约束的要求:
【1】外键名称建议和主键一样。
【2】外键数据类型和长度必须和主键一致。
其他建议:我们编写数据库脚本的时候,一定要先添加灭有外键约束的数据表,因为后面要用到。
use CourseManageDB --这个大家不要忘记,否则你就会把表创建到master数据中 go --建议:先创建简单的数据表(没有外键关系的表) if exists(select*from sysobjects where name=‘Teacher‘) drop table Teacher go create table Teacher ( --规范:字段名称 数据类型和长度 约束要求(逐渐约束,检查约束,默认约束,外键约束) TeacherID int primary key, LoginAccount varchar(50) not null, LoginPWD varchar(18) check(len(LoginPWD)>=6 and len(LoginPWD)<=18) not null, TeacherName varchar(20) not null, PhoneNumber char(11) unique not null, NowAddress nvarchar(100) default(‘地址不详‘) ) go --课程分类表 if exists(select * from sysobjects where name=‘CourseCategory‘) drop table Teacher go create table CourseCategory ( CategoryID int identity(10,1) primary key, CategoryName varchar(20) not null ) go --课程表 if exists(select * from sysobjects where name=‘Course‘) drop table Course go create table Course ( CourseID int identity(1000,1) primary key, CourseName varchar(50) not null, CourseContent nvarchar(500) not null, ClassHour int not null, Cedit int not null, CategoryID int references CourseCategory(CategoryID) not null, --外键约束 TeacherID int references Teacher(TeacherID) ) go --可以根据自己的项目的要求,扩展其他数据表。
测试数据的使用及其重要性
1.关于测试数据的重要性
我们创建数据库,必须基于脚本。然后正确的添加一部分基础数据。因为测试数据的准确性,会关系到我们后面项目数据的真实性。
2.测试数据要求
第一,必须通过脚添加。
第二,数据量多少根据你的要求决定(如果数据量很大,可以通过自己写程序,生成数据)。
第三,首先添加主键表的数据,其次添加外键表的数据。
注意:标识列,在插入数据的时候,如果这列有错误,下次你再插入的时候,这个标识列就被使用了,不能继续用了。
同理,如果你删除了106,当你再次添加的时候,会从107开始,也不会吧106给你补上。
use CourseManageDB go --讲师数据表 insert into Teacher(TeacherName,LoginAccount,LoginPWD,PhoneNumber,NowAddress) values(‘X老师‘,‘.NET课程001‘,‘123456‘,‘12345678900‘,‘天津X区‘), (‘Y老师‘,‘.NET课程002‘,‘123456‘,‘12345678901‘,‘天津Y区‘), (‘Z老师‘,‘.NET课程003‘,‘123456‘,‘12345678902‘,‘天津Z区‘), (‘A老师‘,‘.NET课程004‘,‘123456‘,‘12345678903‘,‘天津A区‘), (‘B老师‘,‘.NET课程005‘,‘123456‘,‘12345678904‘,default) select * from Teacher --添加课程分类 insert into CourseCategory(CategoryID,CategoryName) values(10,‘.NET编程‘),(11,‘工控开发‘),(12,‘Java编程‘) select * from CourseCategory insert into Course(CourseName,CourseContent,ClassHour,Cedit,CategoryID,TeacherID) values(‘.NET/C#上位机开发VIP课程09‘,‘C#基础/OOP/SQL/WinForm/ASP.NET/WPF/WCF‘,500,10,10,102), (‘.NET/C#上位机开发VIP课程10‘,‘基于PLC+C#开发课程‘,500,10,11,103) select * from Course
特别的:当我们删除数据的时候,如果主键表中的数据已经被外键表引用过,则逐渐表这个数据无法直接被删除。