我有一个INSERT
看起来像这样的声明:
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
),我宁愿避免某种尴尬的解决方案,即我有一个触发器created_at
但一个DEFAULT CURRENT_TIMESTAMP
on updated_at
。出于某种原因,MySQL 只允许每个表有一个自动时间戳,所以我不能CURRENT_TIMESTAMP
同时为created_at
和updated_at
.
这是SHOW CREATE TABLE
for officer
:
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