MySQL Trigger:将auto_increment值复制到insert上的另一列

时间:2013-09-23 12:46:57

标签: mysql sql triggers

我需要在插入时将auto_increment ID值复制到另一列中。 我想我需要一个“插入后”触发器,因为否则新ID不知道..?

我试过了:

IF NEW.content IS NULL THEN
    SET NEW.content = NEW.id;
END IF

但它抱怨道:

  

触发后

不允许更新NEW行

5 个答案:

答案 0 :(得分:2)

关于此代码

  CREATE TRIGGER insert_example
  BEFORE INSERT ON notes
  FOR EACH ROW 
  SET NEW.content = (
        SELECT AUTO_INCREMENT 
        FROM information_schema.TABLES 
        WHERE TABLE_SCHEMA = DATABASE() 
        AND TABLE_NAME = 'notes'
  );

我做了类似这样的事情

SET NEW.content = (SELECT CONCAT('ID',LPAD(AUTO_INCREMENT, number,'0')) 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = DATABASE() 
AND TABLE_NAME = 'notes');

如果你在id字段上使用UNSIGNED_ZEROFILL ......你可能需要一个自定义类型的" public" ID ...

答案 1 :(得分:0)

是的,触发器无法实现这一点。您可以做的最好的事情是用INSERT替换CALL some_procedure(values...)语句,并在其中实现上述逻辑。 (假设您可以在应用程序端更改SQL)。

设置EVENT的另一个(但更丑陋的)解决方案,定期修复您的记录,content=NULL

答案 2 :(得分:0)

正如OP指出的那样,NEW.id不能用于自动增量;可以使用以下触发器(使用风险自负)。试试这个。

CREATE TRIGGER insert_example 
      BEFORE INSERT ON notes
      FOR EACH ROW 
      SET NEW.content = (
            SELECT AUTO_INCREMENT 
            FROM information_schema.TABLES 
            WHERE TABLE_SCHEMA = DATABASE() 
            AND TABLE_NAME = 'notes'
      );

答案 3 :(得分:0)

有点躲闪,你能说出来吗

DELIMITER $$
CREATE TRIGGER sometrigger
AFTER INSERT ON sometable
BEGIN
  UPDATE sometable SET content = NEW.id WHERE id = NEW.id;
END $$

通过完整查询更新(相同)表,而不是尝试使用SET。

甚至

DELIMITER $$
CREATE TRIGGER sometrigger
AFTER INSERT ON sometable
BEGIN
  UPDATE sometable SET content = id WHERE content is null;
END $$

(这有点类似于Allita对事件的建议)

答案 4 :(得分:0)

如果您确实需要此行为出于某种原因,您可以通过使用单独的表进行排序和BEFORE INSERT触发器来实现

首先,您需要一个简单的表来进行排序,可能看起来像

CREATE TABLE table1_seq
(
  id int not null auto_increment primary key
);

然后您的事实表架构可能看起来像

CREATE TABLE table1
(
  id int not null default 0 primary key,
  content int
);

现在是触发器

DELIMITER $$
CREATE TRIGGER tg_ai_table1
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  INSERT INTO table1_seq() VALUES();
  SET NEW.id = LAST_INSERT_ID(), NEW.content = COALESCE(NEW.content, NEW.id);
END$$
DELIMITER ;

现在你插入table1

INSERT INTO table1 () VALUES (NULL),(-1);

你会有

| ID | CONTENT |
|----|---------|
|  1 |       1 |
|  2 |      -1 |

这是 SQLFiddle 演示