MySQL 学习笔记(三):完整性和触发器设计

news/2025/2/26 13:43:45

(一)完整性设计

方法一、在设计表时定义约束
删除数据库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 ('95001','李勇','',20,'CS');
insert into student values ('95002', '刘晨','',19,'IS');
insert into  student values('95003', '王敏', '',18, 'MA');
insert into student values('95004', '张立', '',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('4', '操作系统', '6', 3);
insert into Course values('5', ' 数据结构', '7', 4);
insert into Course values('6', '数据处理',  '',  2);
insert into Course values('7',  'PASCAL语言', '6', 4);

insert into SC values('95001', '1', 92);
insert into SC values('95001', '2', 85);
insert into SC values('95001', '3', 88);
insert into SC values('95002', '2', 90);
insert into SC values('95002', '3', 80);

 

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

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

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

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

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

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

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

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

 insert into  student values ('95005','李刚','',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 就可以了。

 

 

转载于:https://www.cnblogs.com/weixuqin/p/9091642.html


http://www.niftyadmin.cn/n/1485114.html

相关文章

树莓派 换源_树莓派Raspbian minimal image下载站搭建

树莓派Raspbian minimal image下载站搭建烧写镜像下载镜像Balena Etcher烧写镜像&#xff0c;准备一张空的SD卡&#xff0c;选择好镜像和SD卡&#xff0c;直接Flash等待烧写完毕。启动系统把卡插入&#xff0c;开机&#xff0c;通过HDMI显示输出&#xff0c;就有命令行界面了。…

System.Web.HttpException: 类型“TextBox”的控件“ctl02_TextBox2”必须放在具有 runat=server 的窗体标记内。...

目的&#xff1a;加入用户自定义控件 错误提示&#xff1a;System.Web.HttpException: 类型“TextBox”的控件“ctl02_TextBox2”必须放在具有 runatserver 的窗体标记内。 沒有ctl02_TextBox2这个控件啊&#xff1f; WebUserControl.ascx 代码 <% Control …

如何使用httpClient的形式调用WebService接口?

工作中接到一份新需求&#xff1a;调用第三方短信接口&#xff0c;实现验证码接收。 第三方提供&#xff1a; 1.wsdl形式的接口文档地址&#xff1a; 2.浏览器中访问该文档地址&#xff1a; 3.下载soapUi工具&#xff0c;测试该文档接口。&#xff08;我使用的是ReadyApi工具…

YAML基础教程

一、YAML介绍 YAML参考了其他多种语言&#xff0c;包括&#xff1a;XML、C语言、Python、Perl以及电子邮件格式RFC2822。Clark Evans在2001年5月在首次发表了这种语言&#xff0c;另外Ingy dt Net与Oren Ben-Kiki也是这语言的共同设计者。YAML是"YAML Aint a Markup Langu…

陈俊宏:HTML5 APP与云端应用整合

HTML5 综述 HTML5 将移动终端与云计算融为一体&#xff0c;所以它不只是技术&#xff0c;更是一种新概念&#xff0c;是一种各行各种都要把服务往移动终端整合的新概念。 概念上&#xff0c;HTML5 Mobile Cloud&#xff0c;商业模式将开始起大变化。因为 HTML5&#xff0c;您…

Could not open connection 异常记录与分析

项目突发异常&#xff0c;此博文记录个人分析&#xff0c;如有高人大可提出见解&#xff0c;在此感谢&#xff01; 异常信息&#xff1a; org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; 个人翻译&…

里如何调整字体间距_啤酒生产:根据麦芽的质量如何调整粉碎机轧辊间距呢?...

闲话不多说&#xff0c;八匠鼎松仁直接进入今天的主题&#xff1a;国内目前使用的麦芽粉碎机有二辊、四辊、五辊与六辊等多种&#xff0c;其中最常见的是五辊粉碎机。五辊粉碎机中第一、第二辊组成第Ⅰ对轧辊&#xff0c;主要将麦粒轧破&#xff0c;使内容物从麦芽内破壳而出&a…

Mac下Maven的删除和安装

一 删除maven 找到当前的maven路劲:使用mvn -v查看当前maven的安装目录在哪 删掉sudo rm -rf [maven的路径] 二 安装maven 1.下载maven压缩包 mac下下载apache-maven-3.5.x-bin.tar.gz 记住是gz哦! 2.然后解压 tar xzvf apache-maven-3.5.3-bin.tar.gz 3.将解压的文件放入到一…