使用innoDB存储引擎获取mysql中的组合键(年份/数字)

问题描述 投票:0回答:1

我想在 innoDB 表中创建一个组合键,该表已经有一个“ID”列,该列具有自动递增值作为主键。

假设我们在“test_db”中有以下“test_table”:

我为“test_table”创建了“incyear_num”触发器:

SET New.num_field := IFNULL(
  ( SELECT  MAX(num_field)+1
        FROM  test_table
        WHERE  year_field = New.year_field ), 1)

这个触发器(“插入之前”)似乎效果很好:

但是 il 让我有一个疑问:在多个同时插入的情况下,即使具有不同的“ID”,它是否可以生成相同的组合键(年份/数字)? 如果是这样,我该如何解决这个问题?

另一个问题:考虑在多用户环境中使用,使用此触发器会减慢表工作速度吗?

mysql triggers innodb auto-increment
1个回答
0
投票

要处理多个线程,请使用事务:

START TRANSACTION;
get the new num_field
put that value into the table
etc
COMMIT;

似乎没有必要

id
;只需拥有
PRIMARY KEY(year_field, num_field)

另一个注意事项:

ZEROFILL
将在更高版本的MySQL中删除。 (它在 8.0.17 中被“弃用”。)有一些简单的解决方法。

除了默认级别之外,您几乎永远不需要其他隔离级别,因此请忽略该教训(暂时)。

一笔交易可能也可能不等待另一笔交易完成。各个被锁定;如果没有冲突的锁,那么两个事务可以并行进行。

TRIGGER
PROCEDURE
是正交特征。例如,触发器可以包含所需的所有 SQL 语句,或者它可以调用封装这些语句的过程。

© www.soinside.com 2019 - 2024. All rights reserved.