我想在MySQL中使用一个触发器,只有当它是一个新条目时才会在表B中插入表A的信息。
如果表A中有新条目,我的触发器总是将表A的所有委托插入到表B中:
CREATE TRIGGER trigger_insert
AFTER INSERT
ON tableA FOR EACH ROW
BEGIN
INSERT INTO `tableB`
(
`id`,
`active`,
`created_at`,
`updated_at`
)
SELECT
`id`,
`active`,
`created_at`,
NOW()
FROM
tableA;
END;
我的问题是,我有第二个触发器,在任何UPDATE之后插入tableA的entrys。所以我不能让id独一无二。结果应该是tableB是tableA
中任何INSERT和UPDATE语句的某种历史记录感谢任何帮助!
答案 0 :(得分:1)
您的问题是您从TableA
中选择了所有行。我假设你打算:
INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`)
SELECT new.id, new.active, new.created_at, MNW()
您的问题的更一般的答案是在unique
上添加tableB
约束。假设id
定义了重复的条目:
alter table tableB add constaint unq_tableB_id unique (id);
然后更改insert
以忽略任何重复的插入:
INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`)
SELECT `id`, `active`, `created_at`, MNW()
FROM tableA
ON DUPLICATE KEY UPDATE id = VALUES(id);
如果您在使用new
时仍需要重复项,则可以将它们组合在一起:
INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`)
SELECT new.id, new.active, new.created_at, MNW()
ON DUPLICATE KEY UPDATE id = VALUES(id);
这两个查询都假设id
是用于定义副本的内容。
答案 1 :(得分:1)
我的问题的解决方案是基于INSERT INTO ... SELECT
的错误用法。相反,我必须使用NEW
关键字来处理新数据:
CREATE TRIGGER trigger_insert
AFTER INSERT
ON tableA FOR EACH ROW
BEGIN
INSERT INTO `tableB`
(
`id`,
`active`,
`created_at`,
`updated_at`
)
VALUES
(
NEW.`id`,
NEW.`active`,
NEW.`created_at`,
NOW()
);
END;
答案 2 :(得分:1)
我不太确定这种方法是否是您想要的,但是如果您想将另一种语言与MySql连接,这可能会起作用-对我而言确实如此。
x = SELECT MAX(id) FROM Forum; //This won't work. It isn't real code
这显示添加的最新行的ID。如果之后有一个大于此的id,那么我们知道已经添加了新行。
While True:
y = SELECT MAX(id) FROM Forum;
if y > x:
x = y //This makes the new largest id the actual largest id
//make add new row to other table
在线上有用于将编程语言与MySql连接的教程,例如https://pynative.com/python-mysql-insert-data-into-database-table/。这将使您可以将我的伪代码转换为真实代码。
此代码不是实际的代码,因此您不能只复制它,而只是我所做的伪代码。