繁体   English   中英

使用AUTO_INCREMENT的MySQL插入/更新触发器

[英]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

没有为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM