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语句成功执行,这样记录日志才有意义。