(一)完整性设计

方法一、在设计表时定义约束
删除数据库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 就可以了。

最新文章

  1. 夺命雷公狗-----React_native---5---初步读懂代码模式
  2. Hibernate连接mysql数据库并自动创建表
  3. 在打开vs解决方案时,怎样让所以打开的项目自动折叠
  4. Expression表达式树
  5. MVC &ndash; 7.Razor 语法
  6. python笔记1
  7. android WebViewClient的方法解释
  8. 基于 libmemcahce 的memcache 操作
  9. 开发中遇到的问题(一)——java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
  10. Python 基础系列一:初识python
  11. MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法
  12. hiho 1097 最小生成树一&#183;Prim算法 (最小生成树)
  13. CentOS更换源
  14. JDK源码解析之Java SPI机制
  15. John&#39;s trip POJ - 1041(这题数据有点水)
  16. scrapy中deferred的回调
  17. 官方教程:Apache Kylin和Superset集成,使用开源组件,完美打造OLAP系统
  18. TCP 流量控制、拥塞控制
  19. xml命名空间
  20. Java压缩多个文件并导出

热门文章

  1. chkdsk工具怎么修复
  2. .net 实现远程控制 远程协助
  3. 相关度算法BM25
  4. 无限极分类的JS实现
  5. powerdesigner设计的pdm模型导出清晰图片格式
  6. 百度Ueditor编辑器取消多图上传对话框中的图片搜索
  7. JAVA环境安装配置
  8. 136. Single Number唯一的一个只出现了一次的数字
  9. Cloudstack动态修改CPU、内存
  10. 数字图像处理实验(8):PROJECT 04-04,Highpass Filtering Using a Lowpass Image 标签: 图像处理MATLAB 2017-05-25 0