Mysql利用触发器TRIGGER的检查约束

在MySQL中,由于不直接支持CHECK约束,当尝试插入不满足GENDER字段为'F'或'M'的记录时,预期的错误并未出现。文章讨论了如何通过触发器解决这个问题。通过创建一个INSERT触发器,在插入数据时检查GENDER值,若不满足条件则抛出错误。示例代码展示了如何使用IF...THEN...END IF结构来定义触发器,确保数据完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个student表如下所示:

create  table student
(
	ID varchar(10) primary key,
	NAME varchar(20),
	GENDER varchar(2),
	check(GENDER in ('F', 'M')),
);

SID代表学生的学号,NAME表示学生的名字,GENDER是指学生性别

check(GENDER in ('F', 'M'))

这一行是在约束GENDER,GENDER只能在F和M中取值
本来在进行约束之后插入的数据中GENDER的值不是F或M就会报错
但在mysql运行insert into student values('S2','Liu fang', 'A');的时候发现没有报错,而且student表格确实也增加了S2这一列,问题出在哪儿呢?

虽然写check不会报错,但mysql是不支持这样的检查约束

问题就来了,又想添加检查约束,但sql的check约束又不能用,每次insert的时候都希望能够check一次插入的值是否满足约束条件要怎么做呢?

很容易想到使用触发器,因为触发器就是每一次满足insert/delete/update的其中某个条件的时候执行begin函数段里面的语句
我们需要在每次insert的时候对插入的值进行检查
create trigger TRIGGER_NAME after insert/delete/update on TABLE_NAME
所以我们选取上面的insert语句

代码段如下所示:

drop TRIGGER if EXISTS insert_student;
create trigger insert_student after insert on student
for each row
begin
	if 
		new.GENDER != 'F' && new.GENDER != 'M'
	then
		signal sqlstate 'ERROR' set message_text = 'gender取值只能是F和M';
	end if;
end

在满足if条件的时候出现signal报错
一定记住最后的end if;
如果这个表格的检查约束不止这一条需要用到if…then…elseif…then…end if;语句

这时候再执行insert into student values('S2','Liu fang', 'A');这一个语句的时候,出现报错

1644 - gender取值只能是F和M, Time: 0.001000s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值