同学们好,本周我们将学习
如何创建带主键和约束的数据表 如何修改数据表,如何修改数据表中的数据
如何导入批量的数据,如何查询数据等内容
前面我们已经学会了数据库和数据表的简单创建方法
以及数据的输入和简单查询 但还不能满足数据的日常管理需要
前面我们创建的数据表除数据类型外,不带任何约束条件
使得数据的输入不受限制,即使输错了,也能保存到数据库中
但是这样的数据显然是垃圾。
下面我们将 学习在创建数据表时指定主键、
外键 和约束,比如限定性别的取值 只能是男或女。
带约束的数据表 输入数据时就要受到约束的限制,使数据尽可能有效
下面我们就以前面设计的学生表、 课程表和选课表为例
来学习创建数据表时如何指定主键、
外键和添加约束 这是我们的学生表
我们设计的主键是学号,性别的取值限定
男或女,默认 是男。
出生日期是日期型数据,我们故意加了一个字段
年龄字段,目的是为了掩饰某些功能
实际上这个字段是不需要的,因为它可以通过出生日期 计算出来。
下面我们看一下这个表如何创建
假设我们已经启动了数据库服务 现在我们启动企业管理系所有的程序
Mircosoft SQL Server 2012
SQL Server Management Studio
连接数据库,服务器类型,数据库引擎 服务器名称,本机的
IP 地址,SQL Server 身份验证 系统管理员 sa,密码,连接
单击新建查询 选择当前数据库
teaching 这是创建
student 这个数据表的基本的创建语句
下面我们给一些字段加上一些限制条件 一个是给班级限制非空,我们后面写
空格 NOT NULL
给学号限定为主键,我们写空格
PRIMARY KEY。
如果是主键,自然是非空的 给姓名限定非空
空格 NOT NULL 性别默认为男,我们写空格DEFAULT
男
[空白音频]还有一个条件
限定取值男或女 这种约束的一般格式是这样子的,CONSTRAINT
约束名 CHECK,一对圆括号,里面是一个"条件" CONSTRAINT 约束名
是为了给这个约束起个名字,以后可以通过这个名字来修改这个约束 这一部分是可以省略的。
对于性别这个字段,我们就写 CONSTRAINT
consgender,这是我们给这个约束起的一个名字 然后是
CHECK,里面的条件是 sgender
IN,括号里头是
男,女。
这里头的 sgender IN('男','女')就是限定性别的取值
是男或者女之一,不能取其他的值 年龄限定到 0
到 150,我们写 CONSTRAINT
[空白音频] consage
CHECK 一对圆括号,写
sage >=0 and
sage <=150。
and 是一个逻辑运算符,表示并且,我们选中它,执行
这地方有一个语法错误,好,我们这地方没有写逗号
执行,命令成功
这样我们就创建了学生表 student。
在对象资源管理系中,我们展开数据库,找到 teaching
数据库,再展开表,在表里头 我们看到有一个
student,这就是我们刚才创建的数据表 下面我们在这个表中
插入数据,我们要插入 电气
51 1
号 王涛
男 1998年
2月1日生,18岁,我们要插入这样一行数据 那我们的插入语句是
INSERT INTO 表名叫做
Student 然后 VALUES
[空白音频] 班级,电气51
学号 [空白音频]
[空白音频] 姓名
[空白音频] [空白音频]
性别 [空白音频]
出生日期 [空白音频]
我们的数据包含了表中的所有字段值,而且顺序和创建表的字段顺序
是一样的,所以我们这里头省略了 字段列表。
插入日期型数据可以使用 字符串常量,18
是一个整数,是不带引号的 我们执行这一行,好,1
行受影响 就是我们插入成功,这没有问题。
下面,我们再执行这一句 好,它说
违反了 PRIMARY KEY 约束,就是违反了主键约束,为什么呢?
是因为我们的主键重复了,就是你再插一个主键,是 1
号的同学 是不行的,我们改一下这个学号,我们改成 2
号,再执行这一句 好,这就可以了
如果我们再把学号改一下,改成 3 号,就是另一位同学 然后我们再把性别呢故意改错,故意改错
然后我们来执行它,好,它告诉我们 CHECK
约束 consgender 冲突,这是因为违反了性别取值的约束
性别我们改成女,因为它只能取值男或者是女 再来执行
好,这就可以了 下来我们把学号再来改一下,因为学号不能重复的,把学号再改一下
我们把年龄也改一下,188,然后执行 好,这就告诉我们
违反了年龄的这个约束,我们把这个年龄改为 20
再执行 好,这就可以了。
我们看一下我们插入的一些数据
[声响]
执行这一行,选中它,执行。
这是我们插入的四行数据 下面我们再插入一个记录
我们只插入班级,学号和姓名
注意,这时候的字段名列表不能再省略了
因为我们插入的数据不是所有的字段而是部分字段
所以我们后面要写班级、 学号
和姓名,我们剩下班级,学号和姓名
后面字删掉,学号要改一下:5号。
我们选中这一行 执行,好 我们插进去了。
我们再来 查询一下这个数据,选中,查询这一行,执行
我们看第五行,也就是5号同学,尽管我们没有
输入性别,但是呢,性别的取值仍然取了默认值:男
而出生日期和年龄没有默认值,它们的值为空 表示没有输入。
如果我们只插入班级和学号 班级和学号,名字去掉
学号要改一下,改为6号
好,我们再来执行
又有错误,这些原因是什么东西呢?把这个逗号去掉
我们再来执行
它就说不能将NULL值插入'sname'这一列
这是因为我们限定名字是非空的,所以 输入时不能省略名字
这就是我们在创建表时,加了约束所起的作用,避免输入的数据 出错。
类似的方法我们在创建课程表
这是课程表的字段名,含义 数据类型和约束
这是创建课程表的SQL语句
课程编号是主键,课程名称:非空
学时在0-300之间,学分
在0-20之间,课程简介 是text类型,text是备注类型
是存放文字的,容量比varchar要大,是放一段文字的
我们执行一下这个语句 好,创建成功。
我们在这里面也插入一行数据 执行成功。
我们来看一下其中的数据 *
FROM course 选中它 执行。
这就是我们插入的数据 [空白_录音]
下面我们创建选课表
注意,这个表中的主键是组合主键,就是说
主键是由多个字段组成的,这时primary key
不能加在任何一个列上
这是创建选课表的基本的SQL语句
它的主键由两个字段组成,一个是学号,一个是
课程号,是一个组合主键 组合主键的设定不能加到一个列上
要加到表上,就是在最后一个字段的后面,我们写逗号 然后写
PRIMARY KEY
括号里头写两个字的名字 逗号,cnumb,
好,这样我们就设定了 组合主键。
外键也写在最后面 逗号,外键写 FOREIGN KEY
[声响] 写外键的字段名称:snumb
而外键参照了哪个表中的字段 要写REFERENCES
另一个表示student,学号是 student里头的学号
这是一个外键,还有一个外键 是课程号
它是参照了课程表里头的课程号
[声响] 课程表里头的课程号
好,我们把两个外键设定好了
我们执行一下这个语句
这个成功,我们就创建了一个,包含着组合主键和两个
外键的选课表,我们也可以在对象资源管理器中看一下
把这个表折叠起来,展开,再刷新
这就有了Study这个表 下面我们在表中插入数据,注意
这时由于外键的约束,选课表中的数据不能随便输入的
比如我们写INSERT
INTO study这是表名
然后我们插入 VALUES
学号
课程号 分数。
好,我们执行这个插入语句
它告诉我们INSERT语句 与 FOREIGN KEY 约束、 冲突。
什么意思呢? 就是我们插入的数据,这个学号在学生表中是没有的
这就是外键约束参照完整性。
我们查一下学生表
[声响]
学生表上有个学号是 2016006001
我们把它改成006001 我们再来执行这一句,还是不行
说INSERT语句与外键约束里头的 cnumb
有冲突,实际上这个课程编号可能也不是我们
课程表里有的一个学号,我们看一下我们的课程表
[声响]
里头有一个课程编号叫做ENPO9001,我们把这个课程号也改一下
这就执行成功
我们看一下这个结果 这就是我们插入的语句
这就是组合主键和外键的设置和作用
[空白_录音] [空白_录音]