自动递增的MySQL插入/更新触发器
我得到了一张大致如下的表格:自动递增的MySQL插入/更新触发器,mysql,sql,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,这样就可以简单地插入一个名称,并使用下一个可用的CUST
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 ;
分隔符$$
在“客户”上插入之前创建触发器“客户ID”`
每行
开始
如果(NEW.CUSTID)则不需要插入触发器
从
没有为AUTO_INCREMENT列指定值,因此MySQL
自动分配序列号。您还可以显式地
将0指定给列以生成序列号
例如
更新:
要允许在未指定CUSTID时完成插入
INSERT INTO customer(name) VALUES('Chuck');
检查触发器中是否为空:
IF NEW.CUSTID IS NOT NULL AND NEW.CUSTID <= 0 THEN
如果NEW.CUSTID不是NULL,并且NEW.CUSTID在自动递增列中插入“0”会使其递增,与插入NULL相同,因此您实际上既不需要也不希望插入触发器。只使用UPDATE触发器试试。通常你会使用CHECK约束,比如CHECK(custid>0)
but…”CHECK子句被所有存储引擎解析但忽略。“除非有特定的业务原因导致ID不能为0,否则没有数据完整性理由不允许它。你一定喜欢MySQL吧?不幸的是,我的规范规定ID不能低于1。我移植的原始Postgres实际上使用了一个与您建议的完全相同的检查,这很好,但我很难对MySQL执行相同的操作。删除insert触发器当然可以消除错误,但它有点破坏了对象。我仍然能够插入-12
的CUSTID
或类似的东西,这正是我试图阻止的。我的工作假设数据库的用户会尝试这种事情,并且必须以某种方式进行处理。有什么想法吗?您可以修改现有的insert触发器以检查NULL,然后当未指定CUSTID时,它将获得自动增量值,否则它不能为0或更小。删除insert触发器当然可以消除错误,但它会使对象失败。我仍然能够插入-12
的CUSTID
或类似的东西,这正是我试图阻止的。我的工作假设数据库的用户会尝试这种事情,并且必须以某种方式进行处理。有什么想法吗?添加一个声明性约束CHECK(custid>=0)
。我不相信MySQL支持使用CHECK
,并且没有其他选择:(哦,是的,MySQL.:P我知道MySQL允许声明检查约束,即使它可能仍然没有强制执行它们。你可以试试看会发生什么。我是个白痴。只要让你的触发器检查custid<0而不是custid
IF NEW.CUSTID IS NOT NULL AND NEW.CUSTID <= 0 THEN