2016-04-21 11 views
2

Also schreibe ich eine SQL-Abfrage, wie Sie es tun, und ich bin über ein Problem gestolpert. Was ich tun möchte, ist eine Abfrage in der Datenbank jedes Mal, wenn ein einzelner Benutzer eine bestimmte Seite besucht. Die Eindeutigkeit wird durch session_id() erreicht, da dies im Allgemeinen recht zuverlässig ist.SQL Query - INSERT aber nur wenn Datensatz noch nicht existiert?

Was ich will ist eine SQL-Abfrage, die eine Zeile von Daten in zwei Spalten eingefügt, aber nur, wenn diese beiden Spalten nicht bereits den gleichen Wert haben.

wenn Benutzer x Besuche der Seite page1 genannt, dann in der Datenbank, wird es wie unten gezeigt Log:

+------------+---------+ 
| page_name | user_id | 
+------------+---------+ 
| page1 | x | 
+------------+---------+ 

Wie würde ich gehen, um eine Abfrage zu schreiben, die in der Tabelle überprüft, ob die Daten zu sein eingefügt wird ein Duplikat sein?

Meine aktuelle Abfrage lautet wie folgt (es ist nur eine Standardeinsatz Abfrage):

INSERT INTO `page_views` (`page_name`, `user_id`) VALUES ('.$pageName.', \''.session_id().'\') 
+0

Check Antwort hier: - http://stackoverflow.com/questions/16460397/sql-insert-into-table-only-if-record-doesnt-exist –

+0

Mögliche Duplikat [Überprüfen Sie, ob eine Zeile vorhanden , andernfalls einfügen] (http://stackoverflow.com/questions/639854/check-if-a-row-exists-otherwise-insert) – Raj

+1

Mögliches Duplikat von [MySQL Conditional Insert] (http://stackoverflow.com/questions/913841/mysql-conditional-insert) –

Antwort

8

Verwendung INSERT IGNORE statt INSERT. Wenn ein Datensatz keinen vorhandenen Datensatz dupliziert, fügt MySQL ihn wie üblich ein. Wenn der Datensatz ein Duplikat ist, weist das Schlüsselwort IGNORE MySQL an, es still zu verwerfen, ohne einen Fehler zu erzeugen.

Das folgende Beispiel gibt keinen Fehler aus und gleichzeitig werden keine doppelten Datensätze eingefügt.

Die Syntax ist einfach - fügen Sie einfach „ignore“ nach „INSERT“ wie folgt:

INSERT IGNORE INTO mytable 
    (pk, f1, f2) 
VALUES 
    ('abc', 1, 2); 

mehrere Datensätze einfügen Wenn auf einmal mutiple Einfügen von Datensätzen, alle, die nicht wird das Einfügen kann nicht sein, aber jeder das kann sein wird:

INSERT IGNORE INTO mytable 
    (pK, f1, f2) 
VALUES 
    ('abc', 1, 2), 
    ('def', 3, 4), 
    ('ghi', 5, 6); 

im zweiten Beispiel oben, wenn Aufzeichnungen bereits für ‚abc‘ existiert und ‚def‘ dann würden diese beiden Datensätze nicht eingefügt werden, aber der Datensatz für ‚ghi‘ wäre.

+1

Ohh, davon hatte ich bis jetzt noch nichts gehört. Das spart eine zusätzliche Abfrage über meine Methode, cool! – RefreshCarts

+0

Ausgezeichnete Antwort und beheben Sie das Problem. Das einzige Problem ist, dass kein Fehler erzeugt wird, aber es sieht so aus, als ob der 'IGNORE' Teil ignoriert wird, wenn ein SQL-Fenster auf meinem phpMyAdmin verwendet wird ... –

0

Führen Sie eine Überprüfung der Datenbank mit auswählen, um zu sehen, ob es schon da ist :) Codebeispiel unten.

$checkQuery = "SELECT page_name FROM page_views WHERE page_name='".$pageName."' AND user_id='".session_id()."'"; 
$checkResult = mysqli_query($DBLink, $checkQuery); 

    if (mysqli_num_rows($checkResult) != 0){ 
    // CODE FOR IF DUPLICATE FOUND 
    } else { 
    // NO DUPLICATE CODE GOES HERE 
    } 
+1

Dies würde dazu führen, dass mehrere Abfragen statt einer Abfrage verwendet werden Das habe ich versucht zu erreichen. Danke für deinen Beitrag. –

+1

Das ist cool, ich hatte nicht von Insert ignorieren bis heute gehört, nach über 10 Jahren php/mysql, verrückt eh :) Danke für die Arten Wörter, ich werde die INSERT IGNORE-Methode in der Zukunft arbeiten ich mich jetzt auch! – RefreshCarts

Verwandte Themen