首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL插入/用AUTO_INCREMENT更新触发器

问MySQL插入/用AUTO_INCREMENT更新触发器
EN

Stack Overflow用户
提问于 2015-11-10 05:49:16
回答 2查看 1.2K关注 0票数 2

所以,我有一张桌子,大致如下:

代码语言:javascript
复制
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值设置为零,因此我构造了以下触发器:

代码语言:javascript
复制
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为其分配值时插入前为零所致。

这样做的最好方法是将触发器更改为在插入和删除行之后发生,还是有更好的方法只抛出一个错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-10 06:04:28

不需要插入触发器。

来自增量

没有为AUTO_INCREMENT列指定值,因此MySQL自动分配序列号。还可以向列显式分配0以生成序列号。

例如:

代码语言:javascript
复制
create table t(id int auto_increment, primary key(id));
insert into t(id) values (0);
select id from t;
# 1

更新:

若要允许在未指定CUSTID时完成插入,请执行以下操作:

代码语言:javascript
复制
INSERT INTO customer(name) VALUES('Chuck');

在触发器中检查null:

代码语言:javascript
复制
IF NEW.CUSTID IS NOT NULL AND NEW.CUSTID <= 0 THEN
票数 2
EN

Stack Overflow用户

发布于 2015-11-10 06:04:47

将'0‘插入自动增量列将使其增量与插入NULL相同,因此您实际上既不需要也不希望插入触发器。只需使用更新触发器即可。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33623744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档