所以,我有一个大致如下的表格:
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
为其分配一个值时,在插入之前该值为零。值。
执行此操作的最佳方法确实是将触发器更改为在插入和删除行之后发生,还是有更好的方法来执行此操作以引发错误?
最佳答案
不需要插入触发器。
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/