Rus*_* C. 2 mysql sql triggers
我们正在两个系统之间进行迁移,并且需要为我们的一个数据库表保留2个字段,这些字段始终保持同步.这是表结构:
CREATE TABLE `example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`object_id` int(11) NOT NULL DEFAULT '0',
`value` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `object_id` (`object_id`)
);
Run Code Online (Sandbox Code Playgroud)
每当其中一个系统插入新行时,我们需要将object_id设置为id.我们不能使用'before insert',因为id列是一个auto_increment列,因此在插入之前它的值为NULL,并且由于MySQL'插入'on trigger之后的限制,我不能执行以下操作:
CREATE TRIGGER insert_example
AFTER INSERT ON example
FOR EACH ROW
SET NEW.object_id = NEW.id;
Run Code Online (Sandbox Code Playgroud)
我无法更新任何一个系统的代码,因此我需要一种方法在数据库端完成此任务.两个系统都将插入新行.我怎么能做到这一点?
使用在插入之前触发的触发器应该完成工作
CREATE TRIGGER insert_example
BEFORE INSERT ON example
FOR EACH ROW
SET NEW.object_id = NEW.id;
Run Code Online (Sandbox Code Playgroud)
编辑:
正如OP指出的那样,NEW.id不能用于自动增量; 一个可以使用下面的触发器(风险自担使用):
CREATE TRIGGER insert_example
BEFORE INSERT ON example
FOR EACH ROW
SET NEW.object_id = (
SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'example'
);
Run Code Online (Sandbox Code Playgroud)
但我宁愿重新考虑这个有点奇怪的要求 - 为什么你需要在表中两次获得pk值?