1 mysql innodb myisam trigger auto-increment
我已经转换的表有一个小问题,它曾经是 MyISAM,我现在已经把它变成了 InnoDB 表。
原始结构:
id varchar(15),
seqno int(11) auto increment
Joint PK index on the above 2 fields
Run Code Online (Sandbox Code Playgroud)
新结构:
auto_id INT (11) auto increment,
id varchar(15),
seqno int(11)
Run Code Online (Sandbox Code Playgroud)
原始结构在 id 和 seqno 上有一个联合 PK,seqno 会为每个唯一的 id 值自动递增。然后它会在我的 Web 应用程序中返回 seqno 作为 last_insert_id。
使用新的 innodb 结构,因为 innodb 不支持联合主键,我不得不添加一个 auto_id,它现在具有自动增量。
然后我实现了一个触发器来生成每个 id 值的唯一序列号。我的问题是如何设置自动增量 id 以便它返回代替 auto_id 值?当我插入到 my_table 中时,将调用此触发器,以便它可以计算要插入的下一个 seqno 值。
DROP TRIGGER IF EXISTS `innodb_seqno_trigger`;
//
CREATE TRIGGER `innodb_seqno_trigger` BEFORE INSERT ON `my_table`
FOR EACH ROW BEGIN
SET @newseqno = 0;
SELECT MAX(seqno) INTO @newseqno
FROM my_table
WHERE id = NEW.id;
SET NEW.seqno = (@newseqno + 1);
/* HERE I NEED HELP PLEASE TO GET THE AUTO INCREMENT VALUE TO ACTUALLY RETURN NEW.seqno */
END;
//
Run Code Online (Sandbox Code Playgroud)
谢谢彼得
我认为您无法auto_id在BEFORE插入触发器中获得新值。这会做你想做的(如果我理解正确的话):
CREATE TRIGGER innodb_seqno_trigger
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
SELECT MAX(seqno) INTO @newseqno
FROM my_table
WHERE id = NEW.id;
SET NEW.seqno = COALESCE(@newseqno + 1, 1);
END;
Run Code Online (Sandbox Code Playgroud)
在SQL-Fiddle测试
但是您有没有想过如果您有 2 个单独的连接/线程/事务尝试插入相同的内容会发生什么id?
| 归档时间: |
|
| 查看次数: |
10651 次 |
| 最近记录: |