MYSQL遇到的check约束不起作用问题以及触发器详解

1、check约束不管用的情况以及解决办法:

	一般情况下,我们都会写成这样
CREATE TABLE Student (
           Sno char(8) NOT NULL,
           Sname varchar(10) NOT NULL,
           Sex char(2)NOT NULL  DEFAULT '男' CHECK (Sex IN ('男','女')) ,
           Age tinyint(4) NOT NULL DEFAULT '20' CHECK (Age between 15 and 30),
           Phonenumber har(12) DEFAULT NULL);
    

可是当我们运行测试数据时发现,约束并没有起作用,不约束的值也可以放在表中,所以我们要解决这个问题,下面列举两种:

(1)、在约束条件的值比较少的情况下,我们可以采用列举的方法:

比如上面的代码就可以修改为:



CREATE table Student(

		Sno char(8) not null PRIMARY key,
		Sname varchar(10) not null,
		Sex enum('男','女') not null DEFAULT "男",
		Age TINYINT(1) not null DEFAULT '20',
		Phonenumber char(12) UNIQUE,
		
		

这样就可以控制Sex在男和女之间,如果输入的不合法就不会进入。

(2)、在约束条件的值比较多的情况下,我们列举不方便的时候,比如是个范围的时候,利用触发器。

我们首先来了解一下什么是触发器:触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

在这里插入图片描述

触发器的特性:

1、有begin end体,begin end;之间的语句可以写的简单或者复杂   
2、什么条件会触发:I、D、U
  3、什么时候触发:在增删改前或者后
4、触发频率:针对每一行执行   
5、触发器定义在表上,附着在表上。
也就是由事件来触发某个操作,事件包括INSERT语句,UPDATE语句和DELETE语句;可以协助应用在数据库端确保数据的完整性。

创建触发器的规则:

<1>BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后。
<2>FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器触发频率是针对每一行数据触发一次。
<3>tigger_event详解:   
①INSERT型触发器:插入某一行时激活触发器,可能通过INSERT、LOAD DATA、REPLACE 语句触发(LOAD DAT语句用于将一个文件装入到一个数据表中,相当与一系列的INSERT操作);
  ②UPDATE型触发器:更改某一行时激活触发器,可能通过UPDATE语句触发;
  ③DELETE型触发器:删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发。

创建触发器

(1)、创建只有一个执行语句的触发器
	CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句;
(2)、创建有多个执行语句的触发器
	    CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
	    ON 表名 FOR EACH ROW
	    BEGIN
	            执行语句列表
	    END;
(3)、一个小例子
	 CREATE TRIGGER trig2 BEFORE DELETE
	     ON work FOR EACH ROW
	     BEGIN
	       INSERT INTO time VALUES(NOW());
	       INSERT INTO time VALUES(NOW());
	     END;

查看触发器
(1)

SHOW TRIGGERS\G;

//无法查看指定的触发器,只能查看所有的

(2)所有触发器信息都存储在information_schema数据库下的triggers表中,可以使用SELECT语句查询,如果触发器信息过多,最好通过TRIGGER_NAME字段指定查询。

SELECT * FROM information_schema.triggers\G

//显示所有触发器的详细信息;同时,该方法可以查询制定触发器的详细信息。

删除触发器


DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

所以我们刚才的第一个例子用触发器就是:



create trigger studentcheck 

before insert on Student 

for each row

begin

       if new.Age<15 or
new.Age>30 then set new.Age=20;

       end if;

end ;

Tip:
触发器尽量少的使用,因为不管如何,它还是很消耗资源,如果使用的话要谨慎的使用,确定它是非常高效的:
触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。

以上有不对的还望指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值