我有一個INSERT
語句,如下所示:ON DUPLICATE KEY UPDATE在有UPDATE觸發器時不起作用
INSERT INTO officer (officer_number,
name,
bank_id)
VALUES ('',
'',
8)
ON DUPLICATE KEY UPDATE officer_number = '',
name = '',
bank_id = 8,
id = LAST_INSERT_ID(id)
這種做法一直很好。當我添加以下觸發器時它停止工作:
CREATE TRIGGER officer_update BEFORE UPDATE ON `officer`
FOR EACH ROW SET NEW.updated_at = NOW(), NEW.created_at = OLD.created_at
這不是officer
記錄沒有被插入。似乎觸發器正在劫持LAST_INSERT_ID()
或其他東西。我這樣說是因爲下一個執行的查詢是這樣的:
INSERT INTO account (import_id,
branch_id,
account_number,
officer_id,
customer_id,
open_date,
maturity_date,
interest_rate,
balance,
opening_balance)
VALUES ('123',
'4567',
'789',
'0', # This is the officer id which is of course invalid
'321',
'1992-04-22',
'2012-05-22',
'0.0123',
'0',
'10000')
因爲我使用相同的文件運行了幾十個成功的導入,所以我沒有更改我的代碼,現在我的導入無效在我添加此觸發器之後,我必須推斷出觸發器是罪魁禍首。我與另一個表有類似的情況,並刪除觸發器修復問題。
所以我的問題是:
- 有人能解釋一下 具體是什麼導致我的軍官 id設置爲0?
- 這個問題有什麼好的 解決方案?
我在officer.created_at
(還有很多其他表'created_at
s)上有另一個觸發器,我寧願避免某種尷尬的解決方案,我在created_at
上有一個觸發器,但在updated_at
上有一個DEFAULT CURRENT_TIMESTAMP
。出於某種原因,MySQL每個表只允許一個自動時間戳,所以我不能爲created_at
和updated_at
做CURRENT_TIMESTAMP
。
這是officer
的SHOW CREATE TABLE
:
CREATE TABLE `officer` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`officer_number` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`bank_id` bigint(20) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `officer_number` (`officer_number`,`name`),
UNIQUE KEY `officer_number_2` (`officer_number`,`bank_id`),
KEY `bank_id` (`bank_id`),
CONSTRAINT `officer_ibfk_1` FOREIGN KEY (`bank_id`) REFERENCES `bank` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=102735 DEFAULT CHARSET=latin1
請問您可以發佈'SHOW CREATE TABLE officer'的結果以及哪些查詢工作不正確?您的標題顯示爲'ON DUPLICATE KEY UPDATE',但帖子中沒有此類查詢。 – Quassnoi 2010-11-09 13:36:53
Woops。接得好。我已經更新了這個問題。 – 2010-11-09 13:46:54
你可以粘貼你的代碼,用於*退出* LAST_INSERT_ID()'的值嗎?似乎在我的機器上工作正常MySql 5.1.53 – 2010-12-03 05:03:37