2016-08-09 9 views
0

Ich habe eine sehr einfache Tabellenstruktur in der Datenbank:INSERT, wenn nicht vorhanden ELSE DELETE - Mit ON DUPLICATE KEY

ID (Unique), userid, groupid 

mit einem einzigartigen Schlüssel auf Benutzer-ID und groupid - so man kann nicht zwei hat das gleiche. Zum Beispiel:

ID userid groupid 
1  86  5 
2  86  6 

ist möglich, aber:

ID userid groupid 
1  86  5 
2  86  5 

Isnt möglich.

Das alles funktioniert gut. Ich versuche, die Zeile einzufügen, und wenn dies aufgrund eines Duplikats fehlschlägt, lösche diese Zeile. Mein Code ist einfach:

$group_query = $database->prepare("INSERT INTO users_groups (userid,groupid) VALUES (?,?) ON DUPLICATE KEY DELETE FROM users_groups WHERE userid=? AND groupid=?"); 
$group_query->bind_param("iiii", $user_id, $group_id, $user_id, $group_id); 

Ich sehe keinen Grund, warum das nicht funktionieren sollte. Alle Variablen sind auf Integer gesetzt. Sie sind alle tatsächliche Nummern (überprüft). Die Syntax sieht gut aus. Die einzige Schlussfolgerung, die ich habe, ist, dass es keine gültige Abfrage ist - aber ich bin mir nicht sicher, warum es keine gültige Abfrage ist.

Danke für alles!

+0

noch nie von IODKD gehört. Sie geben nicht nur das Verb Ihrer Wahl ein. – Drew

+0

Ich habe gerade eine Suche auf dieser Seite für IODKD durchgeführt und kam nur mit dem, was Sie geschrieben haben. Ich habe auch noch nie von IODKD gehört :) –

+0

Ich habe auch noch nie von IODKEMCF gehört (Einfügen auf doppelten Schlüssel mailen Sie mir CSV-Datei) – Drew

Antwort

1

Sie können zunächst eine select-Anweisung verwenden, um die Zeile basierend auf Benutzer-ID und groupid wählen:

SELECT *FROM table where userid = '86' AND groupid = '5' 

Es wird wieder die Reihe, wenn vorhanden ist, und dann das Array überprüfen, ob größer als 0 oder nicht

if($result_array > 0){ 
// use delete statement 
}else{ 
// user insert statement 
} 
+0

Danke - Ich versuchte, mehrere Abfragen zu vermeiden, aber ich denke, es sieht wie die einfachste Lösung aus :( –

+0

Ya it kann die richtige Lösung für Sie sein, da die Leistung auf dem Server erhöht werden kann –

0

posibility-1:

Insert neue Zeile durch Überprüfung gleiche Datensätze durch SELECT-Anweisung

Insert doppelte Zeile

INSERT INTO users_groups (userid,groupid) SELECT * FROM (SELECT 5,86) AS tmp WHERE NOT EXISTS (SELECT `groupid` FROM users_groups WHERE userid =5 and groupid=86); 

output: 0 Zeilen eingefügt.

Insert tatsächliche Zeilen

INSERT INTO users_groups (userid,groupid) SELECT * FROM (SELECT 6,86) AS tmp WHERE NOT EXISTS (SELECT `groupid` FROM users_groups WHERE userid =6 and groupid=86); 

Ausgang: 1 Zeile eingefügt.

posibility-2:

Einsatz neue Zeilen ersetzen durch

REPLACE INTO users_groups (`userid`,`groupid`) VALUES (?,?); 

Hinweis: REPLACE funktioniert genau wie INSERT, mit der Ausnahme, dass, wenn eine alte Zeile in die Tabelle hat den gleichen Wert wie eine neue Zeile für einen PRIMARY KEY- oder einen UNIQUE-Index. Die alte Zeile wird gelöscht, bevor die neue Zeile beginnt eingefügt.

posibility-3:

Einzigartige Index hinzufügen für groupid, userid

ALTER TABLE `users_groups` ADD UNIQUE (
`userid` , 
`groupid` 
); 

es wird nicht neuer Datensatz einfügen lassen, wenn Sie einfügen wollen, wird es angezeigt Folgefehler

1062 - Doppelter Eintrag '86 -5 'für Schlüssel' groupid '

Verwandte Themen