MySql用JOIN自己更新

时间:2013-07-17 09:03:55

标签: mysql join

我有查询,它选择了所有主键(id)= 1或外键= 1的行。这是自己加入。

SELECT:

SELECT f2.wz AS wz FROM d7x6r_magazyn_faktura_zakupowa f

                        LEFT JOIN (SELECT id,id_glowna, wz FROM d7x6r_magazyn_faktura_zakupowa   )AS f2
                        ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna)
                        AND f2.id_glowna <> 0)
                        OR ( f2.id = f.id  OR f2.id = f.id_glowna))
                        WHERE f.id = 1 OR f2.id_glowna  = 1;

现在我需要在所有行中将单元格wz更新为0。我尝试使用:

UPDATE  d7x6r_magazyn_faktura_zakupowa f

  LEFT JOIN (SELECT id,id_glowna, wz FROM d7x6r_magazyn_faktura_zakupowa   )AS f2
                ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna)
                AND f2.id_glowna <> 0)
                OR ( f2.id = f.id  OR f2.id = f.id_glowna))

SET f2.wz = 0
WHERE f.id = 1 OR f2.id_glowna  = 1;

但由于f2.wz无法更新,因此无效。

3 个答案:

答案 0 :(得分:1)

您似乎不需要子选择,只能使用JOIN: -

UPDATE  d7x6r_magazyn_faktura_zakupowa f
LEFT JOIN d7x6r_magazyn_faktura_zakupowa f2
ON(((f2.id = f.id_glowna OR f2.id = f.id OR f2.id_glowna = f.id OR f2.id_glowna = f.id_glowna)
AND f2.id_glowna <> 0)
OR ( f2.id = f.id  OR f2.id = f.id_glowna))
SET f2.wz = 0
WHERE f.id = 1 OR f2.id_glowna  = 1;

但是你有LEFT JOIN但是正在更新F2,这可能不是那里的行,所以INNER JOIN可能会更好

答案 1 :(得分:1)

您可以在更新/插入/删除时进行连接,但不能更新这些连接表中的记录。

您可以使用触发器执行此操作

DELIMITER $$

CREATE TRIGGER au_table1_each AFTER UPDATE ON table1 FOR EACH ROW
BEGIN
  UPDATE table2 SET fieldY = new.fieldX WHERE ...;
END $$

DELIMITER ;

触发器将使用table1中的一些新数据触发每次更新和更新table2。 在操作之前和之后都有触发器,可以是UPDATE,INSERT或DELETE

请参阅:http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html 并且:http://www.databasedesign-resource.com/mysql-triggers.html

感谢:mysql update, insert, delete with joins

答案 2 :(得分:0)

您必须创建TMP表,LEFT JOIN也不应该