MySQL 插入/更新触发器与 AUTO_INCRMENT

标签 mysql sql

所以,我有一个大致如下的表格:

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_INCRMENT 的工作原理一无所知,我得出的结论是,这是错误的方法。尝试插入没有 CUSTID 值的客户会触发触发器,导致插入失败,我认为这是由于当 AUTO_INCRMENT 为其分配一个值时,在插入之前该值为零。值。

执行此操作的最佳方法确实是将触发器更改为在插入和删除行之后发生,还是有更好的方法来执行此操作以引发错误?

最佳答案

不需要插入触发器。

来自Auto_Increment

No value was specified for the AUTO_INCREMENT column, so MySQL assigned sequence numbers automatically. You can also explicitly assign 0 to the column to generate sequence numbers.

EG

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

关于MySQL 插入/更新触发器与 AUTO_INCRMENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33623744/

相关文章:

c++ - 为什么 SQLite 不让我查询特定的 ATTACHED 数据库?

php - 在数据库 codeigniter 上保存时选择选项问题

mysql - 替换 SQL 数据库中同一自定义字段中的多个字符串值

mysql - 服务器更新后 HAVING 子句不起作用

sql - 用 SQL 计算每天

sql - 如果用户定义类型为 null 则选择整个表

MySQL:显示自帐单日期过去多少天以来的总会费

c# - 如何将 MySql 与 asp.net 身份结合使用以及 MVC 与 Microsoft ASP.NET 身份示例结合使用?

c# - 使用 C# 运行带有关键字 GO 的 .sql 语句?

sql - 在 Codewars 上巧妙使用 SUBSTRING,有人可以向我解释一下它是如何工作的吗? - Postgres