[英]MySQL Insert/Update Trigger with AUTO_INCREMENT
因此,我大致得到如下表:
CREATE TABLE CUSTOMER (
CUSTID INT NOT NULL AUTO_INCREMENT,
NAME CHAR (45),
CONSTRAINT CUSTOMER_PRIMARY_KEY PRIMARY KEY (CUSTID))
AUTO_INCREMENT = 100;
我正在自动递增CUSTID
以便可以简单地插入一个名称,并使用下一个可用的CUSTID
创建它。 但是,我还想确保在创建行或更新时都无法将CUSTID
值设置为零,因此我构造了以下触发器:
DELIMITER $$
CREATE TRIGGER `custid_before_insert` BEFORE INSERT ON `CUSTOMER`
FOR EACH ROW
BEGIN
IF (NEW.CUSTID) <= 0 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT = 'Check constraint on CUSTOMER.CUSTID failed';
END IF;
END$$
CREATE TRIGGER `custid_before_update` BEFORE UPDATE ON `CUSTOMER`
FOR EACH ROW
BEGIN
IF (NEW.CUSTID) <= 0 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT = 'Check constraint on CUSTOMER.CUSTID failed';
END IF;
END$$
DELIMITER ;
不幸的是,由于我对AUTO_INCREMENT
工作方式一无所知,我得出的结论是这是错误的解决方法。 尝试插入没有CUSTID
值的客户会触发触发器,导致插入失败,我认为是由于在AUTO_INCREMENT
为其分配值之前,该值在插入前为零。
做到这一点的最佳方法真的是更改触发器,使其在插入和删除行之后发生,还是有更好的方法来抛出错误?
不需要插入触发器。
没有为AUTO_INCREMENT列指定任何值,因此MySQL自动分配了序列号。 您也可以将0明确分配给该列以生成序列号。
例如
create table t(id int auto_increment, primary key(id));
insert into t(id) values (0);
select id from t;
# 1
更新:
要在未指定CUSTID的情况下完成插入,
INSERT INTO customer(name) VALUES('Chuck');
在触发器中检查null:
IF NEW.CUSTID IS NOT NULL AND NEW.CUSTID <= 0 THEN
在自动增加的列中插入“ 0”会导致它的增加与插入NULL相同,因此您实际上既不需要也不需要INSERT触发器。 仅使用UPDATE触发器进行尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.