sql >> Database >  >> RDS >> Mysql

MySQL U gebruikt de veilige update-modus en u heeft geprobeerd een tabel bij te werken zonder een WHERE

Het lijkt erop dat MySQL 5.6 beperkt is in het uitvoeren van een UPDATE statement samen met een JOIN

Dus in plaats van

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

U moet zoveel vragen schrijven als nodig zijn, zoals:

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

Omdat dit behoorlijk vervelend is om te typen, kan men dynamische SQL gebruiken om de update-query's te bouwen:

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;

In voorbeeld:

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');

Vraag #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;

Dit geeft uit:

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

De uitvoer kan nu worden gebruikt om handmatig update de verschillende rijen

Bekijken op DB Fiddle



  1. Bestaande auth.User-gegevens migreren naar het nieuwe aangepaste gebruikersmodel van Django 1.5?

  2. Waarom MySQL de VIEW-querytekst volledig opnieuw formatteren?

  3. Een mysql-resultatenset doorlopen

  4. Escape-tabelnaam MySQL