所以,我的表大致如下:
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
为其赋值时插入的值为零。
执行此操作的最佳方法是更改插入和删除行后发生的触发器还是有更好的方法来执行此操作只是抛出错误?
答案 0 :(得分:2)
不需要插入触发器。
没有为AUTO_INCREMENT列指定值,因此MySQL 自动分配序列号。你也可以明确地说 将0分配给列以生成序列号。
E.G。
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
答案 1 :(得分:2)
将'0'插入自动增量列使其增加与插入NULL相同,因此您实际上既不需要也不需要INSERT触发器。只需使用UPDATE触发器即可尝试。