【发布时间】:2013-10-22 16:20:35
【问题描述】:
我有一个有序列号的表。此序列号将更改,引用自动编号将不起作用。我担心触发器的值会发生冲突。如果两个事务同时读取。
我已经对 3 个连接进行了模拟测试,每个连接有大约 100 万条记录,并且没有冲突。
CREATE TABLE `aut` (
`au_id` int(10) NOT NULL AUTO_INCREMENT,
`au_control` int(10) DEFAULT NULL,
`au_name` varchar(50) DEFAULT NULL,
`did` int(10) DEFAULT NULL,
PRIMARY KEY (`au_id`),
KEY `Did` (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
TRIGGER `binc_control` BEFORE INSERT ON `aut`
FOR EACH ROW BEGIN
SET NEW.AU_CONTROL = (SELECT COUNT(did)+1 FROM aut WHERE did = NEW.did);
END;
【问题讨论】:
-
SELECT COUNT(*)+1--- 这真是个坏主意。au_control应该指什么? -
如果碰撞可能是个问题,那么创建
UNIQUE(did, au_control)似乎是明智的。我不确定触发器中的选择是否是原子的,我会假设它们是 not。 -
你可以定义你的
PRIMARY KEY(did,au_control),第二个作为自动增量字段,但它有一些缺点(1)你丢失了au_id列,但是一个真正的主键而不是一个代理可能会更好,(2) 表 必须 是 MyISAM,因为 InnoDB 不支持它,这有严重的缺点。 See this fiddle -
@Wrikken 感谢您的回答。我不知道 MyIsam 会那样做。我对小提琴的挑战是我失去了唯一识别记录的能力。要使用这种方法,我现在需要同时引用序列和 DID。更新序列号时,如果发生错误,我可能会丢失我的记录站点。