【问题标题】:MySQL Trigger: Update with Inner JoinMySQL 触发器:使用内部联接更新
【发布时间】:2021-07-06 21:07:38
【问题描述】:

我正在尝试通过 INNER JOINING a VIEW 使 AFTER UPDATE 触发器 UPDATE 另一个表,但无法使其正常工作。

在对 Table1 进行更新后,我想通过 INNER JOIN 与 view1 来更新 Table3。

我尝试了多种变体:

UPDATE T1,T2
INNER JOIN T2 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2,
T2.C3 = expr
WHERE condition

这是我的小提琴:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=a713b9e640a32073f6f8b5f91c38a794

我当前的代码给了我错误“mysql Not unique table/alias”。

编辑:

-- Trigger

CREATE TRIGGER trigger1
AFTER UPDATE
ON Table1
FOR EACH ROW
BEGIN


UPDATE Table3
INNER JOIN view1 ON Table3.id = view1.id
SET
Table3.results1 = view1.results1,
Table3.results2 = view1.results2,
Table3.results3 = view1.results3
WHERE Table3.id = view1.id;


end;

【问题讨论】:

  • 这能回答你的问题吗? Not unique table/alias
  • UPDATE T1 而不是UPDATE T1,T2
  • @forpas,我试过了。给我错误“无法更新表格,功能已在使用中。
  • @ObsidianAge,对于更有经验的人来说,它可能会。我只是在尝试数小时后才发布。
  • 您会收到新错误,因为在小提琴中 T2 不是表格,而是从 Table1 中选择的视图。在此处发布您的实际代码,因为它是您的代码,它只有一个语法错误。

标签: mysql


【解决方案1】:

正如错误消息所说,您无法使用调用表进行更新,但您可以通过制作临时表来规避它

-- Table1

CREATE TABLE Table1 (id INT,session VARCHAR(50), value1 VARCHAR(50),
value2 VARCHAR(50),value3 VARCHAR(50),status VARCHAR(50));

INSERT INTO Table1 (id,session,value1,value2,value3,status) 
VALUES
(1,1,1,2,3,'inactive'),
(1,2,1,2,3,'inactive'),
(2,1,1,3,4,'inactive'),
(2,2,2,3,4,'inactive'),
(3,1,2,3,2,'active'),
(3,2,2,3,4,'inactive');

select * from Table1
✓ ✓ 编号 |会议 |值1 |值2 |价值3 |地位 -: | :-------- | :----- | :----- | :----- | :-------- 1 | 1 | 1 | 2 | 3 |不活跃 1 | 2 | 1 | 2 | 3 |不活跃 2 | 1 | 1 | 3 | 4 |不活跃 2 | 2 | 2 | 3 | 4 |不活跃 3 | 1 | 2 | 3 | 2 |积极的 3 | 2 | 2 | 3 | 4 |不活跃
-- Table2

CREATE TABLE Table2 (value VARCHAR(50),status VARCHAR(50), 
results varchar(50));

INSERT INTO Table2 (value,status,results) 
VALUES
(1,'active','BRK'),
(2,'inactive','GOOG'),
(2,'active','HOG'),
(3,'active','XOM'),
(1,'inactive','INTC'),
(4,'inactive','APPL'),
(3,'active','NKE'),
(2,'inactive','SBUX'),
(1,'inactive','BCE'),
(1,'inactive','S&P'),
(2,'active','FB'),
(5,'inactive','FSLY'),
(1,'inactive','AMZN'),
(2,'inactive','ARKK'),
(3,'inactive','AGEN'),
(4,'inactive','C'),
(3,'inactive','TSLA'),
(2,'active','MSFT');

select * from Table2
✓ ✓ 价值 |状态 |结果 :---- | :------- | :------ 1 |活跃 | BRK 2 |不活跃 |谷歌 2 |活跃 |猪 3 |活跃 | XOM 1 |不活跃 |国际贸易中心 4 |不活跃 |应用程序 3 |活跃 | NKE 2 |不活跃 | SBUX 1 |不活跃 |公元前 1 |不活跃 |标普 2 |活跃 |脸书 5 |不活跃 | FSLY 1 |不活跃 |亚马逊 2 |不活跃 | ARKK 3 |不活跃 |阿根 4 |不活跃 | C 3 |不活跃 |特斯拉 2 |活跃 |微软
-- Table3

CREATE TABLE Table3 (id INT, session VARCHAR(50), results1 VARCHAR(50),
results2 VARCHAR(50),results3 VARCHAR(50));

INSERT INTO Table3 (id, session, results1, results2,results3) 
VALUES
(1,1,null,null,null),
(1,2,null,null,null),
(2,1,null,null,null),
(2,2,null,null,null),
(3,1,null,null,null),
(3,2,null,null,null);

select * from Table3
✓ ✓ 编号 |会议 |结果1 |结果2 |结果3 -: | :-------- | :------- | :------- | :-------- 1 | 1 | | | 1 | 2 | | | 2 | 1 | | | 2 | 2 | | | 3 | 1 | | | 3 | 2 | | |
-- View1 (Random conditional on Table1)

CREATE VIEW view1 AS
SELECT Table1.id,Table1.session, (select results from Table2
where (Table1.status = Table2.status
and Table1.value1 = Table2.value)
order by RAND() limit 1) as results1,

(select results from Table2
where (Table1.status = Table2.status
and Table1.value2 = Table2.value)
order by RAND() limit 1) as results2,

(select results from Table2
where (Table1.status = Table2.status
and Table1.value3 = Table2.value)
order by RAND() limit 1) as results3
from Table1;

select * from view1
✓ 编号 |会议 |结果1 |结果2 |结果3 -: | :-------- | :------- | :------- | :-------- 1 | 1 |亚马逊 |方舟 |阿根 1 | 2 |标准普尔 | SBUX |阿根 2 | 1 |标准普尔 |阿根 |应用程序 2 | 2 | SBUX |阿根 |应用程序 3 | 1 |脸书 | NKE |猪 3 | 2 |方舟 |阿根 |应用程序
-- Trigger

CREATE TRIGGER trigger1
AFTER UPDATE
ON Table1
FOR EACH ROW
BEGIN


UPDATE Table3
INNER JOIN (SELECT * FROM view1) v ON Table3.id = v.id
SET
Table3.results1 = v.results1,
Table3.results2 = v.results2,
Table3.results3 = v.results3
WHERE Table3.id = v.id;


end;
-- Update

UPDATE Table1
SET value1 = 2
WHERE id = 1 and session = 1;
SELECT * FROM Table3;
编号 |会议 |结果1 |结果2 |结果3 -: | :-------- | :------- | :------- | :-------- 1 | 1 |方舟 |方舟 |特斯拉 1 | 2 |方舟 |方舟 |特斯拉 2 | 1 |公元前 |特斯拉 | C 2 | 2 |公元前 |特斯拉 | C 3 | 1 |微软 | XOM |猪 3 | 2 |微软 | XOM |猪

db小提琴here

【讨论】:

  • 谢谢!!我什至不知道临时表是可能的。有很多东西要学。
  • 是否可以只更新/内连接与在 Table1 中更新的 ID 关联的行?如果我更新了 ID1 的行,那么只有那些关联的行会加入,而其他行会从上次加入时保留下来。如果这是一个更好的新问题,我可以创建一个。
  • 添加到触发器 AND Table3.id = NEW.id 中的 where 子句,使用 NEW,您可以访问所有列的值 OLD 具有更新前的所有旧值,此外您还可以对答案进行投票
  • 完美!谢谢
猜你喜欢
  • 2022-10-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多