【问题标题】:Get the latest inserted id in a trigger?在触发器中获取最新插入的 id?
【发布时间】:2010-02-15 00:28:17
【问题描述】:

我使用触发器插入一行,并希望在后续查询中使用最后创建的 id。

我该怎么做?

代码如下:

BEGIN
IF (NEW.counter >= 100) THEN
INSERT INTO tagCategories (name, counter) VALUES ('unnamed', NEW.counter);
// here i want to have access to the above inserted id
UPDATE tagCategories2tagPairs SET tagCategoryId = <<ID_HERE>> WHERE tagPairId = OLD.id
END IF;
END

【问题讨论】:

    标签: mysql database triggers


    【解决方案1】:

    你看过LAST_INSERT_ID()吗?但请注意:

    如果您使用 单个 INSERT 语句, LAST_INSERT_ID() 返回值 为第一个插入的行生成 仅限。

    【讨论】:

    • 当我在 after_trigger 中使用它时,它会出于某种原因返回先前插入的 ID...例如不过可以使用NEW.id。例如OLD.id 可用于删除或更新(至少这是文档中所写的内容。)。 docs.
    • @ravo10 确切地说,应该使用 NEW 和 OLD 对象来避免多行插入问题,而不是 LAST_INSERT_ID()。这显示在this SO answer
    【解决方案2】:

    我想使用像“AAA”这样的公司首字母缩写,并将插入 ID 添加到其中,并将其用作内部公司 ID,这就是我获取最后一个当前插入 ID 的方式

    DELIMITER //
    CREATE TRIGGER company_run_before_insert BEFORE INSERT ON ap_company 
    FOR EACH ROW
    BEGIN
    
    SET @lastID = (SELECT id FROM ap_company ORDER BY id DESC LIMIT 1);
    IF @lastID IS NULL OR @lastID = '' THEN
        SET @lastID = 0;
    END IF;
    SET @lastID = @lastID +1;
    SET NEW.ap_company_id = concat(NEW.company_initials,'-', @lastID);
    END;
    

    【讨论】:

      【解决方案3】:

      使用新的.id

      BEGIN
      insert INTO test_questions (test_id, question, variant1, variant2, variant3, w1, type_id) 
      SELECT NEW.id, t1.question, t1.v1, t1.v2, t1.v3, t1.answer, 1
      FROM new_minitest_questions t1
      WHERE t1.mt_id = NEW.old_id;
      END
      

      【讨论】:

        【解决方案4】:

        以下触发器将从信息架构中获取最后一个自动增量值。我写了这个触发器来生成一个 slug。

        例如,如果列的名称是“名称”并且列具有诸如“Robin Shankar”之类的值,则触发器会将空格替换为“-”并将自动增量 ID 附加到 slug 的末尾,因此制作独特的蛞蝓。

        robin_shankar_9071

        DELIMITER //
        CREATE TRIGGER insert_slug_sd
        BEFORE INSERT ON `your_table_name`
        FOR EACH ROW
        BEGIN
        
        DECLARE auto_increment_ INT(11);
        
        SELECT 
            `auto_increment` 
        INTO 
            auto_increment_
        FROM INFORMATION_SCHEMA.TABLES
            WHERE 
        table_name = 'your_table_name';
        
        SET NEW.`Slug` = CONCAT(LOWER(REPLACE(NEW.`Name`,' ','-')),'-',auto_increment_);
        END; //
        
        DELIMITER;
        

        【讨论】:

          【解决方案5】:
          SET NEW.num=CONCAT("А-", (
            SELECT `auto_increment` 
            FROM INFORMATION_SCHEMA.TABLES    
            WHERE table_name = 'menu')
          )
          

          【讨论】:

          • max(id) 等如果您要删除最后一条记录则不起作用
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-25
          • 2018-03-08
          • 1970-01-01
          • 2014-11-05
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多