sql >> Databáze >  >> RDS >> Mysql

MySQL Používáte bezpečný režim aktualizace a pokusili jste se aktualizovat tabulku bez WHERE

Zdá se, že MySQL 5.6 má omezené možnosti spouštění UPDATE prohlášení spolu s JOIN

Takže místo

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

Budete muset napsat tolik dotazů, kolik potřebujete, například:

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

Vzhledem k tomu, že je to dost nepříjemné na psaní, lze k vytvoření aktualizačních dotazů použít dynamické SQL:

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;

Příklad:

Schéma (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');

Dotaz č. 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;

Výsledkem je:

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

Výstup lze nyní použít ručně aktualizujte různé řádky

Zobrazit na DB Fiddle



  1. MySql select IN klauzule řetězec oddělený čárkou

  2. Najděte nejčastější hodnotu ve sloupci SQL

  3. Vytvořte databázi MySQL z Javy

  4. Spuštění Galera Cluster na Kubernetes