所以,我有一张桌子,大致如下:
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为其分配值时插入前为零所致。
这样做的最好方法是将触发器更改为在插入和删除行之后发生,还是有更好的方法只抛出一个错误?
发布于 2015-11-10 06:04:28
不需要插入触发器。
来自增量
没有为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发布于 2015-11-10 06:04:47
将'0‘插入自动增量列将使其增量与插入NULL相同,因此您实际上既不需要也不希望插入触发器。只需使用更新触发器即可。
https://stackoverflow.com/questions/33623744
复制相似问题