2016-07-05 3 views
0

Ich versuche, eine Spalte zu aktualisieren, aber ich muss den neuen Wert überprüfen sollte nicht in der Tabelle vorhanden sein. Aus irgendeinem Grund kann ich keinen eindeutigen Index für diese Spalte erstellen. Wie kann ich das bei der Abfrage handhaben?Wie kann ich mich mit einer Spalte als einzigartig verhalten, ohne Index zu haben?

UPDATE mytable SET col = :val WHERE id = :id; 

Nun, wie kann ich überprüfen, :val nicht vor der Aktualisierung in der col Spalte existiert?

+0

‚Basierend auf irgendeinem Grund kann ich nicht einen eindeutigen Index auf dieser Spalte erstellen‘ Es ist möglich, dass Sie den eindeutigen Index nicht erstellt werden kann, weil es bereits eine duplizieren in deiner Tabelle .. hast du nachgesehen? –

+0

@BrianGlaz Nein nein .. mein Tisch ist jetzt leer. Ich möchte keinen eindeutigen Index für diese Spalte erstellen, da {Long Store} ':-)' – stack

+0

Schreiben Sie einen Trigger, um zu prüfen, ob der neue Wert zuerst existiert oder nicht. – topshot

Antwort

1

Sie können keinen einfachen NOT EXISTS-Subselect ausführen, wie Sie es in anderen SQL-Sprachen tun können. Sie können jedoch eine Querverknüpfung zu einer virtuellen Tabelle durchführen, die nach der Existenz von val sucht und verhindern, dass eine Aktualisierung auftritt, wenn die virtuelle Tabelle ein Ergebnis liefert.

UPDATE mytable AS tb1 
CROSS JOIN (SELECT 1 `valExsits` FROM mytable WHERE col = :val LIMIT 1) AS tbTest 
SET tb1.col = :val 
WHERE tb1.id = :id AND tbTest.valExsits IS NULL 
+0

@Shadow, danke für den Kopf. Ich hätte der Sql-Sprache Aufmerksamkeit schenken sollen. Ich habe meine Antwort entsprechend aktualisiert. –

+0

Warum 'CROSSE JOIN'? – stack

+0

Ich denke, ich hätte einen 'LEFT JOIN' machen können, aber ein Cross Join war angemessener. Wenn die virtuelle Tabelle keine Zeile zurückgibt, verhindert sie bei Verwendung eines Kreuz-Joins nicht, dass die Ergebnisse von Mytable zurückgegeben werden, wenn die ID übereinstimmt. Wenn ich einen inneren Join gemacht habe und es keine Übereinstimmung gab, die das Update verhindert hätte, da keine Zeile von der virtuellen Tabelle zurückgegeben wird. –

1

können Sie ein verwenden nicht

UPDATE mytable SET col = :val WHERE id = :id 
    and not(1 = (select ifnull(max(1),0) from mytable where col = :val)) ; 
+0

@stack .. ich sehe keine upvote .. – scaisEdge

+0

Sorry ich vergaß .. Ich habe es jetzt gemacht :-) – stack

Verwandte Themen