(一)完整性设计

方法一、在设计表时定义约束
删除数据库school,建立新数据库school1

drop database school;
create database school;
use school;

1.定义约束

create table Student(
Sno char(9) primary key, /*主键约束 提示primary key */
Sname char(20) unique, /* 唯一约束 提示 unique */
Ssex char(2) check (Ssex='男' or Ssex='女'), /* 检查约束 提示 性别只能是男或女 check */
Sage int check (sage <= 100 and sage>=1), /* 检查约束 提示年龄介于1 到 100之间 check*/
Sdept char(20) default 'CS' /* 缺省 缺省值为CS, default() */
); create table Course(
Cno char(4) primary key, /*主键约束 */
Cname char(40) unique, /* 唯一约束 */
Cpno char(4) not null, /*非空约束 提示not null */
Ccredit int default 1 /* 缺省值为1 */
); create table SC(
Sno char(9),
Cno char(4),
Grade int check (grade>=0 and grade<=100), /* 约束取值为0 到100 * check /
primary key(Sno, Cno),
foreign key (Sno) references Student(sno) on delete cascade on update cascade,
foreign key (Cno) references Course(Cno) on delete cascade
/*定义(Sno,Cno)为主键 */
/*定义sno为外键参考student表的主键sno,并且实现级联删除更新SC表中相应的元组 */
/* 提示 foreign key .. references ... on delete cascade on update cascade,
/*定义Cno为外键参考course表的主键Cno,并且实现级联删除SC表中相应的元组 */
);

2. 检验约束

插入下列记录

insert into  student values ('','李勇','男',20,'CS');
insert into student values ('', '刘晨','女',19,'IS');
insert into student values('', '王敏', '女',18, 'MA');
insert into student values('', '张立', '男',19, 'IS'); insert into Course values(1,'数据库', 5,4);
insert into Course values(2, '数学', 3 ,2);
insert into Course values(3, '信息系统', 1, 4);
insert into Course values('', '操作系统', '', 3);
insert into Course values('', ' 数据结构', '', 4);
insert into Course values('', '数据处理', '', 2);
insert into Course values('', 'PASCAL语言', '', 4); insert into SC values('', '', 92);
insert into SC values('', '', 85);
insert into SC values('', '', 88);
insert into SC values('', '', 90);
insert into SC values('', '', 80);

请设计系列测试用例逐一检查每一个定义的约束是否生效

例如:检查student表的主键约束是否生效,测试用例

insert into  student values ('','测试','男',20,'CS');

报错:ERROR 1062 (23000): Duplicate entry '95001' for key 'PRIMARY' 

检查student表的唯一约束是否生效,测试用例

insert into  student values ('','李勇','男',20,'CS');

报错:ERROR 1062 (23000): Duplicate entry '李勇' for key 'Sname' 

检查student表的检查约束是否生效,测试用例

 insert into  student values ('','李刚','牛',20,'CS');

插入成功 Query OK, 1 row affected (0.00 sec)。其实这里理论上来说应该是插入失败的,因为 student 有检查约束,但不同于SQL,在MYSQL中,CHECK只是一段可调用但无意义的子句。MySQL会直接忽略。

方法二、在表定义完成后,添加修改约束

建立新数据库school2

create databaes school2;
use school2;

1. 定义表

  create table student(
Sno char(9),
Sname char(20),
Ssex char(2) ,
Sage int ,
Sdept char(20)
); create table Course(
Cno char(4),
Cname char(40),
Cpno char(4) ,
Ccredit int
); create table SC(
Sno char(9),
Cno char(4),
Grade int
);

2.添加修改约束

(1). 添加主键约束

alter table 表名 add constraint 约束名(形如:PK_表名) primary key (主键)

alter table Student add constraint PK_Student primary key(Sno);
alter table Course add constraint PK_Course primary key(Cno);
alter table Sc add constraint PK_SC primary key(Sno, Cno);

(2). 添加外键约束

alter table 从表 add constraint 约束名(形如:FK_从表_主表) foreign key(属性名) references 主表(属性名)

alter table SC add constraint SC_Student foreign key(sno) references Student(sno);
alter table SC add constraint SC_Course foreign key(cno) references Course(cno);

(3). 外键约束 + 级联(删除/更新)

alter table 从表 add constraint 约束名 foreign key(属性名) references 主表(属性名)  ON DELETE CASCADE ON UPDATE CASCADE

alter table SC add constraint SC_Students foreign key(sno) references Student(sno) on delete cascade on update cascade;
alter table SC add constraint SC_Courses foreign key(cno) references Course(cno) on delete cascade;

发现报错Can't write; duplicate key in table '#sql-1f2_7',发现原来是这里的约束名和前面的重复了,需要重新命名一下。

(4). 添加唯一约束

alter table 表名 add constraint 约束名(形如:UQ_表名) unique (属性名)

alter table Student add constraint UQ_Student unique(sname);
alter table Course add constraint UQ_Course unique(cname);

(5). 添加默认约束

alter table表名alter column字段名drop default; (若本身存在默认值,则先删除)
alter table表名 alter column字段名 set default默认值;(若本身不存在则可以直接设定)

alter table student alter column sdept set default 'CS';
alter table course alter column ccredit set default 1;

(6). 添加检查check约束

alter table 表名 add constraint 约束名(形如:CK_表名) check (属性名 约束条件 )

alter table Student add constraint CK_Student check(Ssex='男' or Ssex='女');
alter table Student add constraint CK_Student check(sage <= 100 and sage>=1);
Alter table Course add constraint CK_Course check(grade>=0 and grade<=100);

2.检查约束是否生效
参考方法一设计测试用例,逐一检查!
结果:测试后发现跟方法一出现的结果是一样的。

3. 删除约束
删除主键约束:alter table 表名 drop primary key;
删除外键约束:alter table 表名 drop foreign key 外键(区分大小写);
设计测试用例,检查删除约束后是否生效?
添加多个约束,情况如何?
这里我删除约束的时候报错了:ERROR 1025 (HY000): Error on rename of './school/#sql-1f2_7' to './school/student' (errno: 150 - Foreign key constraint is incorrectly formed)
查了下资料,发现 MySQL建立外键的字段必须和引用表的字段一模一样的类型。 这里我创建外键的时候 sno 中有些表有主键约束,有些却没有,所以当我删除主键约束的时候它会提示外键被错误建立起来了。但我不明白为什么建立外键的时候没有报错。

(二)触发器

MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。
创建触发器
在MySQL中,创建触发器语法如下:

CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

其中:
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。

删除触发器

drop trigger 触发器名

写个触发器:

delimiter $$
create trigger hiChange after insert on student for each row
begin
select 'hi,成功插入数据' into @ee; /*使用 select 语句来打印输出*/
end
$$
delimiter ;

刚开始创建的时候报错:Not allowed to return a result set from a trigger。原因:在mysql的trigger和function中不能出现select * from table形式的查询,因为其会返回一个结果集;而这在mysql的trigger和function中是不可接受的,但是在存储过程中可以。在 select 语句后加上 into @ee 就可以了。

MySQL 学习笔记(三):完整性和触发器设计的更多相关文章

  1. MYSQL学习笔记三:日期和时间函数

    MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...

  2. MySql学习笔记三

    MySql学习笔记三 4.DML(数据操作语言) 插入:insert 修改:update 删除:delete 4.1.插入语句 语法: insert into 表名 (列名1,列名2,...) val ...

  3. mysql学习笔记三 —— 数据恢复与备份

    要点: 1.存储引擎2.导入导出3.备份与恢复 查看当前数据库中的所有表use db1:show tables: 1.存储引擎 不同的发动机(引擎)适用的汽车类型不一样. 存储和处理的不同方式.不同的 ...

  4. Android Studio安卓学习笔记(三)Android用户界面的设计布局与组件(一)用户界面布局设计(1)

    当我们创建了一个安卓项目后,我们会发现真正建立一个完善的安卓项目并不是想象的那么容易.其实和设计GUI可视化界面一样,开发安卓也需要考虑很多方面,主要考虑的还是界面布局和需要的组件. 一:Androi ...

  5. MySQL学习笔记三:库和表的管理

    1.MySQL数据库服务配置好后,系统会有4个默认的数据库. information_schema:虚拟对象,其对象都保存在内存中 performance_schema:服务器性能指标库 mysql: ...

  6. mysql基本数据类型(mysql学习笔记三)

    Mysql数据类型 小数: 浮点:小数位可以变化 Float单精度默认精度6位左右 Double 双精度默认精度16位左右 支持,控制数值范围 Type(M,D) M表示所有数值位数(不包括小数点和符 ...

  7. MySQL学习笔记(三)—索引

    一.概述 1.基本概念       在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经 ...

  8. MySQL学习笔记(三):常用函数

    一:字符串函数 需要注意的几个细节: 1.cancat中有一个字符串为null,则结果为null. 2.left(str,x) 和 right(str,x)中x为null,则不返回任何字符串,不是nu ...

  9. mysql学习笔记(三)

    -- 主键冲突(duplicate key) ,'xujian','anhui'); ,'xiewei','anhui'); ,'luyang','anhui');-- 主键冲突了 -- 可以选择性的 ...

  10. MySql学习笔记(三) —— 聚集函数的使用

    1.AVG() 求平均数 select avg(prod_price) as avg_price from products; --返回商品价格的平均值 ; --返回生产商id为1003的商品价格平均 ...

随机推荐

  1. 3.solr学习速成之索引添加 查询 删除

    solrserver.java public class solrServer { private solrServer(){}; final static String SOLR_URL = &qu ...

  2. 前端学习---html基础知识

    HTML基本知识 学习html首先我们先看看HTML本质: web框架本质 我们在学socket,我们创建一个socketserver,然后运行起来,有一个client客户端要连接socket服务端, ...

  3. Java之泛型

    1. 概述          在引入泛型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入泛型后,一个复杂类型就可以在细分成更多的类型.          例如原先的类型List ...

  4. 十分钟学会Fiddler

    一.Fiddler介绍 Fiddler是一个http抓包改包工具,fiddle英文中有“欺骗.伪造”之意,与wireshark相比它更轻量级,上手简单,因为只能抓http和https数据包,所以在针对 ...

  5. MySQL中SQL_CALC_FOUND_ROWS的用法

    1. SQL_CALC_FOUND_ROWS简述 在很多分页的程序中都这样写: #查出符合条件的记录总数 SELECT COUNT(*) from [table] WHERE ......; #查询当 ...

  6. 什么是HUD

    [什么是HUD] 游戏HUD的意思: 说直白点就是在屏幕上显示你的游戏相关信息,让玩家可以随时了解那些最重要最直接相关的内容.就是说,像我们玩游戏的时候,显示您的武器耐久度不够了,您的血量不足了等等. ...

  7. Spring总结八:jdbcTemplate的简单使用

    简介: Srping毕竟是一站式框架,所以也有操作数据库的东西,那就是jdbcTemplate,介绍一下jdbcTemplate的简单使用. 除了要引入必要的包以外,还需要引入 spring-jdbc ...

  8. 一个虚拟机网络的XML描述

    <?xml version="1.0" encoding="utf-8"?> <VNET> <ID>1</ID> ...

  9. Python学习笔记_操作Excel

    Python 操作Exel,涉及下面几个库: 1.xlrd 读取Excel文件 2.xlwt 向Excel文件写入,并设置格式 3.xlutils 一组Excel高级操作工具,需要先安装xlrd和xl ...

  10. zynq qemu学习

    1,ubuntu给软件包降级,先安装aptitude sudo apt-get  install aptitude 2,强制降级,等号“=”前后不能有空格 sudo aptitude install ...