Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL Anda menggunakan mode pembaruan aman dan Anda mencoba memperbarui tabel tanpa WHERE

Tampaknya MySQL 5.6 terbatas dalam menjalankan UPDATE pernyataan bersama dengan JOIN

Jadi, alih-alih

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

Anda harus menulis pertanyaan sebanyak yang diperlukan seperti :

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

Ini cukup mengganggu untuk mengetik, seseorang dapat menggunakan SQL dinamis untuk membuat kueri pembaruan :

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;

Contoh :

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

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

Ini menghasilkan :

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

Outputnya sekarang dapat digunakan untuk secara manual perbarui baris yang berbeda

Lihat di DB Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menggunakan array nilai dari PHP dalam klausa 'IN' dari kueri mysql?

  2. Pokoknya untuk Membatasi waktu Eksekusi Query MySQL?

  3. Variabel Sesi:Berapa banyak data yang terlalu banyak?

  4. prosedur mysql untuk memperbarui referensi numerik di baris sebelumnya ketika ada yang diperbarui

  5. Mengapa menggunakan pernyataan yang disiapkan mysql lebih aman daripada menggunakan fungsi escape umum?