我被一个问题搞得筋疲力尽!
我已经使用MySQL设置了我的第一个检查约束,但不幸的是,我遇到了一个问题。在插入测试失败的行时,无论如何都会插入该行。
结构:
CREATE TABLE user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
uname VARCHAR(10) NOT NULL,
fname VARCHAR(50) NOT NULL,
lname VARCHAR(50) NOT NULL,
mail VARCHAR(50) NOT NULL,
PRIMARY KEY (id),
CHECK (LENGTH(fname) > 30)
);insert语句:
INSERT INTO user VALUES (null, 'user', 'Fname', 'Lname', 'mail@me.now');fname列中的字符串长度应该太短,但无论如何都会插入它。
我很确定我在这里遗漏了一些基本的东西。
发布于 2010-06-12 09:28:08
MySQL doesn't enforce CHECK constraints, on any engine.
这让我不禁要问,为什么要将fname列声明为VARCHAR(50),但却要强制要求它只能有30个字符?
也就是说,唯一的替代方法是使用触发器:
CREATE TRIGGER t1 BEFORE INSERT ON user
FOR EACH ROW BEGIN
DECLARE numLength INT;
SET numLength = (SELECT LENGTH(NEW.fname));
IF (numLength > 30) THEN
SET NEW.col = 1/0;
END IF;
END;发布于 2018-06-02 12:01:27
如上所述,你必须使用触发器,MySQL不支持check,而且当你的触发器块中有多个语句时,比如声明变量或控制流,你需要以begin和end开始,并将触发器封装在两个delimiters中:
注意:如果您使用MariaDB,请在第一个分隔符之后和第二个分隔符之前使用//,否则,如果您使用MySQL,请使用$$。
delimiter //
create trigger `user_insert_trigger` before insert on `user` for each row
begin
declare maximumFnameLength int unsigned;
declare fNameLength int unsigned;
set maximumFnameLength = 30;
set fNameLength = (select length(new.fNameLength));
if (fNameLength > maximumFnameLength) then
signal sqlstate '45000'
set message_text = 'First name is more than 30 characters long.';
end if;
end
//
delimiter ;https://stackoverflow.com/questions/3027118
复制相似问题