MySQL使用触发器实现check约束功能


MySQL使用触发器实现check约束功能

MySQL可以使用check约束,但check约束对数据验证没有任何作用。所以我们可以使用触发器来实现check约束功能。

-- 创建表
USE luo; #使用数据库
CREATE TABLE IF NOT EXISTS jobs ( 
JOB_ID INT PRIMARY KEY auto_increment, #自动增长列 必须是主键 
JOB_TITLE varchar(35) NOT NULL, 
MIN_SALARY decimal(6,0), 
MAX_SALARY decimal(6,0) 
CHECK(MIN_SALARY>=2500) #不起作用
);

-- 插入数据
INSERT INTO jobs VALUES('2','2',222,25000);
INSERT INTO jobs VALUES('3','2',3000,25000);

SELECT *FROM jobs;

-- 用触发器实现check
DROP TABLE IF EXISTS jobs;
DELIMITER //
DROP TRIGGER IF EXISTS t_insert_check //
CREATE TRIGGER t_insert_check after INSERT ON jobs FOR EACH ROW BEGIN
DECLARE msg VARCHAR(200);
IF (new.MIN_SALARY < 2500) THEN #对jobs监视,就不能使用jobs.MAX_SALARY,只能用new.MAX_SALARY或old.MAX_SALARY
        SET msg = "最低工资为2500";  
        -- MySQL 5.5 新增SIGNAL异常处理
        signal sqlstate 'HY000' SET message_text = msg;  
    END IF;
END//
DELIMITER ;

-- 显示触发器
SHOW TRIGGERS;
SHOW TRIGGERS LIKE '%t_insert_check%';

-- 查看jobs表
TRUNCATE jobs;
SELECT *FROM jobs;


思考:到底应该使用before还是after,要根据具体情况而定,
一般需要更改要操作的数据时使用before。如果记录日志要使用after。
只有使用了after才能确保DML语句成功执行,这样记录日志才有意义。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值