我有一個表有序號。這個序號會改變,引用自動號碼將不起作用。我擔心觸發器的值會發生碰撞。如果兩個事務同時讀取。基於查詢原子的觸發器?
我已經在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'應該指的是什麼? – zerkms
如果碰撞可能是一個問題,那麼創建一個'UNIQUE(did,au_control)'似乎是明智的。我不確定在觸發器中的選擇是否是原子的,我會認爲它們不是_not_。 – Wrikken
雖然你可以定義你的'PRIMARY KEY(did,au_control)',第二個是自動增量字段,但是它有一些缺點(1)你失去了'au_id'列,而是一個真正的主鍵而不是代理可能會更好,(2)該表將被認爲是MyISAM,因爲InnoDB不支持它,這具有嚴重的缺點。 [看到這個小提琴](http://sqlfiddle.com/#!2/31788/1) – Wrikken