Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Sie verwenden den abgesicherten Update-Modus und haben versucht, eine Tabelle ohne WHERE zu aktualisieren

Es scheint, dass MySQL 5.6 beim Ausführen eines UPDATE eingeschränkt ist -Anweisung zusammen mit einem JOIN

Also statt

UPDATE table1 a
INNER JOIN table2 asa
ON a.ID = asa.Table1Id
SET a.ReferenceID = asa.ReferenceID
WHERE a.ID > 0 AND asa.ID > 0

Sie müssen so viele Abfragen wie nötig schreiben wie:

UPDATE table1 a
SET a.ReferenceID = <The corresponding value in table 2>
WHERE a.ID = <The corresponding ID>

Da dies ziemlich lästig zu tippen ist, kann man dynamisches SQL verwenden, um die Aktualisierungsabfragen zu erstellen :

SELECT CONCAT('UPDATE table1 a SET a.ReferenceID = ', asa.ReferenceID, ' WHERE a.ID = ', t.ID, ';')
FROM table1 t
INNER JOIN table2 asa
ON t.ID = asa.Table1Id;

Im Beispiel:

Schema (MySQL v5.6)

CREATE TABLE test
(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    foo VARCHAR(255)
);

CREATE TABLE test2
(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    id_test INT NOT NULL,
    foo VARCHAR(255),
    FOREIGN KEY (id_test) REFERENCES test(id)
);

INSERT INTO test (foo) VALUES ('hello'), ('world');

INSERT INTO test2 (id_test, foo) VALUES (1, 'bar'), (2, 'baz');

Abfrage 1

SELECT CONCAT('UPDATE test t SET t.foo = ''', t2.foo, ''' WHERE t.id = ', t.id, ';') AS 'sql query'
FROM test t
INNER JOIN test2 t2
ON t.id = t2.id_test;

Dies gibt aus:

UPDATE test t SET t.foo = 'bar' WHERE t.id = 1;
UPDATE test t SET t.foo = 'baz' WHERE t.id = 2;

Die Ausgabe kann nun manuell verwendet werden aktualisiere die verschiedenen Zeilen

Auf DB Fiddle ansehen