数据库的创建和操作

创建和操作数据库

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

特别的:当我们删除数据的时候,如果主键表中的数据已经被外键表引用过,则逐渐表这个数据无法直接被删除。