2016-04-07 6 views
0

Ich habe eine Tabelle mit mehreren Spalten vorhandener Daten wie bereitsmysql-Update, wenn alle Werte existieren nicht in derselben Tabelle sonst nichts

 
+------+------+--------------+------+---------+ 
| id | ref |name   |role | status | 
+------+------+--------------+------+---------+ 
| 1 | ab |Faizal  |adm | 1  | 
| 2 | ab |Faizal  |  | 0  | 
| 3 | cd |Faizal  |usr | 1  | 
| 4 | am |Agrim   |usr | 1  | 
| 5 | xy |vishal  |usr | 1  | 
| 6 | xy |vishal  |usr | 0  | 
| 7 | ad |ankush  |usr | 1  | 
| 8 | ad |ankush  |  | 0  | 
| 9 | mm |vishal  |oth | 1  | 
+------+------+--------------+------+---------+ 

und ich will nicht, eine Rolle zu einem Benutzer mehrere Zeit in Tabelle zuweisen, Update sollte nur Maßnahmen ergreifen, wenn in der Tabelle Benutzer haben nicht die gleiche Rolle mit dem gleichen Status. Wie ich diese Abfrage versucht

UPDATE roles t1 
SET 
    t1.role = 'adm', 
    t1.status = '1', 
    t1.ref = 'ab' 
WHERE t1.id = 2 AND NOT EXISTS 
(
    SELECT 1 
    FROM roles t2 
    WHERE t1.role = t2.role 
      AND t1.status = t2.status 
      AND t1.ref = t2.ref 
) 

Es gibt einen Fehler ich nach dem Ausführen der Abfrage wollen:

 
+------+------+--------------+------+---------+ 
| id | ref |name   |role | status | 
+------+------+--------------+------+---------+ 
| 1 | ab |Faizal  |adm | 1  | 
| 2 | ab |Faizal  |  | 0  | 
| 3 | cd |Faizal  |usr | 1  | 
| 4 | am |Agrim   |usr | 1  | 
| 5 | xy |vishal  |usr | 1  | 
| 6 | xy |vishal  |usr | 0  | 
| 7 | ad |ankush  |usr | 1  | 
| 8 | ad |ankush  |  | 0  | 
| 9 | mm |vishal  |oth | 1  | 
+------+------+--------------+------+---------+ 

nichts geändert Da die gegebene Schlüsseldaten existieren bereits in der Tabelle.


Ein weiteres Beispiel: Führen Sie die Abfrage mit anderen wichtigen Daten.

UPDATE roles t1 
SET 
    t1.role = 'adm', 
    t1.status = '1', 
    t1.ref = 'ad' 
WHERE t1.id = 8 AND NOT EXISTS 
(
    SELECT 1 
    FROM roles t2 
    WHERE t1.role = t2.role 
      AND t1.status = t2.status 
      AND t1.ref = t2.ref 
) 

nach dem Ausführen der Abfrage-Tabelle soll:

 
+------+------+--------------+------+---------+ 
| id | ref |name   |role | status | 
+------+------+--------------+------+---------+ 
| 1 | ab |Faizal  |adm | 1  | 
| 2 | ab |Faizal  |  | 0  | 
| 3 | cd |Faizal  |usr | 1  | 
| 4 | am |Agrim   |usr | 1  | 
| 5 | xy |vishal  |usr | 1  | 
| 6 | xy |vishal  |usr | 0  | 
| 7 | ad |ankush  |usr | 1  | 
| 8 | ad |ankush  |  | 0  | 
| 9 | mm |vishal  |oth | 1  | 
+------+------+--------------+------+---------+ 

im Auge Bedingungen halten:

  1. Wir können nicht INSERT oder DELETE Tabelle in.
  2. Kann nicht die Zeilen aktualisieren, wenn status = 1
+1

zeigen Sie uns Beispieldaten und Wunschergebnis \t Bitte lesen Sie [** How-to-Ask **] (http: // stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http://spaghettiba.com/2015/04/24/how-to-post-at -sql-question-on-a-public-forum /) lernen, wie Sie die Qualität Ihrer Fragen verbessern und bessere Antworten erhalten. –

+0

Jetzt habe ich meine Frage PLZ Check .. aktualisiert und mich nach dem Lesen der vollständigen Frage .. –

+0

Ich verstehe nicht, dass Sie nicht EXIST und Sie haben die eindeutige ID, warum stören Sie, die NICHT EXISTIEREN? –

Antwort

1

Während der update Anweisung alle Verweise auf die Datensätze in dieser Tabelle noch wie vor der eigentlichen Aktualisierung auf die Daten beziehen, so ist es, dass die Unter normal ist select berücksichtigt nicht die Werte, die Sie einfügen, sondern die Werte, die bereits in der Tabelle vorhanden sind.

Auch diese Syntax mit selbst referenzierenden Unterabfrage ist nicht von MySql erlaubt. Verwenden Sie stattdessen eine left join.

Liste So die Literalwerte Sie aktualisieren, dass Join-Bedingung wie folgt:

UPDATE roles t1 
LEFT JOIN roles t2 
     ON t2.role = 'adm' 
     AND t2.status = '1' 
     AND t2.ref = 'ab' 
SET 
    t1.role = 'adm', 
    t1.status = '1', 
    t1.ref = 'ab' 
WHERE t1.id = 2 
AND t2.id IS NULL 

Diese letzte Bedingung zu Ihrem NOT EXISTS entspricht. Die LEFT JOIN wird NULL Werte in allen t2 Spalten produzieren, wenn die JOIN Bedingung keine Ergebnisse liefert.

Wenn Sie einen eindeutigen Schlüsseleinschränkung für diese drei Felder haben, dann können Sie das gleiche mit dem ignore Stichwort erreichen:

UPDATE IGNORE roles 
SET 
    role = 'adm', 
    status = '1', 
    ref = 'ab' 
WHERE id = 2 

Wenn dies in einem Duplikat der Anweisung zur Folge hätte werden nichts tun, noch Bericht ein Fehler.

+0

# 1093 - Sie können die Zieltabelle 't1' für die Aktualisierung in der FROM-Klausel –

+0

nicht angeben. Bitte geben Sie diese Information in Ihrer Frage an, da Sie diese Fehlermeldung bereits mit Ihrer SQL-Anweisung erhalten haben. Antwort ist nun korrigiert und auch eine Alternative hinzugefügt. – trincot

+0

Was soll ich tun? Ich kenne den einzigartigen Schlüssel nicht ??? Vielen Dank im Voraus –

Verwandte Themen