我们正在两个系统之间进行迁移,并且需要为我们的一个数据库表保留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`)
);
每次其中一个系统插入新行时,我们需要将object_id设置为id。我们不能使用'before insert',因为id列是一个auto_increment列,因此在插入之前它的值为NULL,并且由于MySQL'插入'触发器后的限制'我无法执行以下操作:
CREATE TRIGGER insert_example
AFTER INSERT ON example
FOR EACH ROW
SET NEW.object_id = NEW.id;
我无法更新任何一个系统的代码,因此我需要一种在数据库端完成此操作的方法。两个系统都将插入新行。我怎么能做到这一点?
答案 0 :(得分:5)
使用在插入之前触发的触发器应该完成工作
CREATE TRIGGER insert_example
BEFORE INSERT ON example
FOR EACH ROW
SET NEW.object_id = NEW.id;
编辑:
正如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'
);
但我宁愿重新考虑这个有点奇怪的要求 - 为什么你需要在表格中两次获得pk值?
答案 1 :(得分:0)
答案 2 :(得分:-1)
我认为您的触发器永远不会创建,因为您无法在AFTER INSERT触发器中引用NEW.column_name。
尝试在BEFORE INSERT触发器中执行此操作(请不要这样修复,因为它不起作用):
CREATE TRIGGER `insert_example` BEFORE INSERT ON `t`
FOR EACH ROW
SET NEW.`object_id` = NEW.`id`;
请根据您的架构更改表名和列名。
希望这有帮助。