sql >> Database teknologi >  >> RDS >> Mysql

MySQL Du bruger sikker opdateringstilstand, og du forsøgte at opdatere en tabel uden et WHERE

Det ser ud til, at MySQL 5.6 er begrænset til at udføre en OPDATERING sætning sammen med en JOIN

Så i stedet for

OPDATERING tabel1 aINNER JOIN tabel2 asaON a.ID =asa.Table1IdSET a.ReferenceID =asa.ReferenceIDWHERE a.ID> 0 OG asa.ID> 0 

Du bliver nødt til at skrive så mange forespørgsler som nødvendigt, f.eks.:

OPDATERING tabel1 aSET a.ReferenceID =HVOR a.ID = 

Dette er ret irriterende at skrive, man kan bruge dynamisk SQL til at bygge opdateringsforespørgslerne :

SELECT CONCAT('OPDATERING tabel1 a SET a.ReferenceID =', asa.ReferenceID, ' WHERE a.ID =', t.ID, ';')FRA tabel1 tINNER JOIN tabel2 asaON t.ID =asa.Table1Id;

For eksempel:

Skema (MySQL v5.6)

CREATE TABLE test( id INT IKKE NULL PRIMÆR NØGLE AUTO_INCREMENT, foo VARCHAR(255)); CREATE TABLE test2( id INT IKKE NULL PRIMÆR NØGLE AUTO_INCREMENT, id_test INT IKKE NULL, foo VARCHAR(255), FOR (id_test) REFERENCER test(id));INSERT INTO test (foo) VALUES ('hello'), ('world');INSERT INTO test2 (id_test, foo) VALUES (1, 'bar'), (2, ' baz'); 

Forespørgsel #1

SELECT CONCAT('OPDATERING test t SET t.foo =''', t2.foo, ''' WHERE t.id =', t.id, ';') SOM 'sql-forespørgsel'FROM test tINNER JOIN test2 t2ON t.id =t2.id_test; 

Dette udsender:

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

Outputtet kan nu bruges til at manuelt opdatere de forskellige rækker

Se på DB Fiddle



  1. forhindrer duplikatrækkeindsættelse i php/mysql

  2. Opdater en databasemailprofil (SSMS)

  3. PostgreSQL midlertidige tabeller

  4. Fejlkode:1406. Data for lange til kolonne - MySQL