我用的是Mysql5.5,我创建一张表,f2和f3字段都是非空字段
CREATE TABLE t_tee (f1 INT,f2 INT NOT NULL,f3 VARCHAR(20) NOT NULL);
我执行
insert into t_tee (f1) values (1);
数据库只给我提出警告,数据依然能插进去,
f2和f3的结果会插入0和''
但是这种情况下,我不想让这条记录插入,我应该怎么设置。
CREATE TABLE t_tee (f1 INT,f2 INT NOT NULL,f3 VARCHAR(20) NOT NULL);
我执行
insert into t_tee (f1) values (1);
数据库只给我提出警告,数据依然能插进去,
f2和f3的结果会插入0和''
但是这种情况下,我不想让这条记录插入,我应该怎么设置。
这样就保证了该列不为null,且当不显式为该列赋值的时候报错。示例代码如下(只以f3列为例):
插入前触发器:
DELIMITER $$
DROP TRIGGER IF EXISTS testtable_before_insert $$
CREATE TRIGGER testtable_before_insert
BEFORE INSERT ON testtable FOR EACH ROW
BEGIN
IF NEW.name is null THEN
insert testtable values ('hello','','');
END IF;
END $$
更新前触发器:
DELIMITER $$
DROP TRIGGER IF EXISTS t_tee_before_update $$
CREATE TRIGGER t_tee_before_update
BEFORE UPDATE ON t_tee FOR EACH ROW
BEGIN
IF NEW.f3 is null THEN
insert t_tee values ('hello','','');
END IF;
END $$
有一个办法,不过没经过权威验证,LZ可以考虑尝试一下(以f3列为例)。首先把这个列改为允许为空,然后创建两个触发器BEFORE INSERT和BEFORE UPDATE,当显式插入null或者隐式插入null(即类似insert into t_tee (f1) values (1))的时候,执行一条明显错误的SQL语句,就会导致插入null失败;在把这列UPDATE为null的时候,同样也执行这条明显错误的SQL语句,就会导致更新为null失败。
这样就保证了该列不为null,且当不显式为该列赋值的时候报错。示例代码如下(只以f3列为例):
插入前触发器:
DELIMITER $$
DROP TRIGGER IF EXISTS t_tee_before_insert $$
CREATE TRIGGER t_tee_before_insert
BEFORE INSERT ON t_tee FOR EACH ROW
BEGIN
IF NEW.f3 is null THEN
insert t_tee values ('hello','','');
END IF;
END $$
更新前触发器:
DELIMITER $$
DROP TRIGGER IF EXISTS t_tee_before_update $$
CREATE TRIGGER t_tee_before_update
BEFORE UPDATE ON t_tee FOR EACH ROW
BEGIN
IF NEW.f3 is null THEN
insert t_tee values ('hello','','');
END IF;
END $$
知道了,设置STRICT_TRANS_TABLES或者STRICT_all_TABLES,即可。