Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动递增的MySQL插入/更新触发器_Mysql_Sql - Fatal编程技术网

自动递增的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