Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Bạn đang sử dụng chế độ cập nhật an toàn và bạn đã cố cập nhật bảng mà không có WHERE

Có vẻ như MySQL 5.6 bị hạn chế về việc thực thi UPDATE câu lệnh cùng với JOIN

Vì vậy, thay vì

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

Bạn sẽ phải viết nhiều truy vấn nếu cần như:

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

Điều này khá khó chịu khi nhập, người ta có thể sử dụng SQL động để xây dựng các truy vấn cập nhật:

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;

Trong ví dụ:

Giản đồ (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');

Truy vấn số 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;

Kết quả này:

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

Đầu ra hiện có thể được sử dụng để thủ công cập nhật các hàng khác biệt

Xem trên 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. Chèn vào bảng theo thứ tự

  2. Làm cách nào để sử dụng mysql_escape_string () trong Yii framework?

  3. Hàm Mysql trả về một giá trị từ một truy vấn

  4. Laravel:Làm cách nào để xóa các hàng khỏi nhiều bảng có cùng id chỉ với 1 truy vấn?

  5. phpMyBackupPro - Công cụ sao lưu MySQL dựa trên web dành cho Linux