我想在 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”,它是否可以生成相同的组合键(年份/数字)? 如果是这样,我该如何解决这个问题?
另一个问题:考虑在多用户环境中使用,使用此触发器会减慢表工作速度吗?
要处理多个线程,请使用事务:
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 语句,或者它可以调用封装这些语句的过程。