2016-10-31 4 views
3

Ich habe die folgende Tabelle:mysql_query() Verhalten ist anders als mysql auf der Kommandozeile

insert_test | CREATE TABLE insert_test (
    id int(11) NOT NULL AUTO_INCREMENT, 
    closed int(11) NOT NULL DEFAULT '0', 
    user int(11) DEFAULT '-1', 
    level int(11) DEFAULT '-1', 
    comment text, 
    count int(11) DEFAULT '1', 
    PRIMARY KEY (id,closed), 
    UNIQUE KEY user (user,level,closed) 
) 

Wenn ich die folgenden Befehle auf der Kommandozeile:

INSERT INTO db.insert_test (closed, user, level, comment, count) VALUES (0, 1, 50, 'First insert', 1) ON DUPLICATE KEY UPDATE comment=VALUES(comment), count=count+1; 
INSERT INTO db.insert_test (closed, user, level, comment, count) VALUES (0, 1, 75, 'Second insert', 1) ON DUPLICATE KEY UPDATE comment=VALUES(comment), count=count+1; 

... das ist ich die Ausgabe erhalten:

+----+--------+------+-------+---------------+-------+ 
| id | closed | user | level | comment  | count | 
+----+--------+------+-------+---------------+-------+ 
| 9 |  0 | 1 | 50 | First insert |  1 | 
| 10 |  0 | 1 | 75 | Second insert |  1 | 
+----+--------+------+-------+---------------+-------+ 

Wenn ich diese Befehle mysql_query() laufen, das ist, was ich bekomme.

+----+--------+------+-------+---------------+-------+ 
| id | closed | user | level | comment  | count | 
+----+--------+------+-------+---------------+-------+ 
| 11 |  0 | 1 | 50 | Second insert |  2 | 
+----+--------+------+-------+---------------+-------+ 

So ist die Abfrage der Aktualisierung wird stattdessen eine neue Zeile einzufügen, wenn ich die mysql_query() Funktion, wenn es nicht sein sollte, weil die beiden Einsätze verschiedenen Ebenen haben und so sind sie einzigartig ... richtig? Habe ich mich geirrt, oder geht hier etwas vor?

Edit: Der Code-Snippet genau dort, wo ich es verwenden ist:

char* query = "INSERT INTO db.insert_test (closed, user, level, comment, count) VALUES (0, 1, 50, 'First insert', 1) ON DUPLICATE KEY UPDATE comment=VALUES(comment), count=count+1;"; 
char* query2 = "INSERT INTO db.insert_test (closed, user, level, comment, count) VALUES (0, 1, 75, 'Second insert', 1) ON DUPLICATE KEY UPDATE comment=VALUES(comment), count=count+1;"; 
mysql_query(link, query); 
mysql_query(link, query2); 

Ich weiß, dass die Verbindung korrekt ist, und dass dieser Code ausgeführt wird, weil es funktioniert (dh die Abfragen ausgeführt werden), mit Ausnahme des Problem, wo es aktualisiert wird, anstatt einzufügen.

+5

Können Sie Ihr Code-Snippet freigeben, wo Sie mysql_query() 'bitte ausführen. – dchayka

+2

** WARNUNG **: Wenn Sie nur PHP lernen, verwenden Sie bitte nicht die [mysql_query'] (http://php.net/manual/en/function.mysql-query.php) Schnittstelle. Es ist so schrecklich und gefährlich, dass es in PHP 7 entfernt wurde. Ein Ersatz wie [PDO ist nicht schwer zu erlernen] (http://net.tutsplus.com/tutorials/php/why-you-should-beusing-phps) -pdo-for-database-access /) und ein Leitfaden wie [PHP The Right Way] (http://www.phptherightway.com/) erläutert Best Practices. – tadman

+1

Ich habe oben ein Code-Snippet eingefügt, lassen Sie mich wissen, wenn Sie mehr brauchen. Und ich hätte erwähnen sollen, das ist in C nicht PHP. – user2073805

Antwort

1

Ich kann kein Problem reproduzieren. Ich habe das gerade getestet, mit Ihrer Tabelle oben (danke, dass Sie einen einfachen Testfall erstellt haben) und einem schnellen C-Programm. Es funktionierte wie erwartet, indem zwei Zeilen eingefügt wurden. Verwenden von MySQL 8.0.0-dmr.

#include <my_global.h> 
#include <mysql.h> 
#include <string.h> 

int main(int argc, char **argv) 
{ 
    MYSQL *con = mysql_init(NULL); 

    if (con == NULL) 
    { 
     fprintf(stderr, "%s\n", mysql_error(con)); 
     exit(1); 
    } 

    mysql_real_connect(con, "localhost", "root", "password", "test", 0, NULL, 0); 

    if (strlen(mysql_error(con))) 
    { 
     fprintf(stderr, "%s\n", mysql_error(con)); 
     mysql_close(con); 
     exit(1); 
    } 

    char* query = "INSERT INTO insert_test (closed, user, level, comment, count) VALUES (0, 1, 50, 'First insert', 1) ON DUPLICATE KEY UPDATE comment=VALUES(comment), count=count+1;"; 
    char* query2 = "INSERT INTO insert_test (closed, user, level, comment, count) VALUES (0, 1, 75, 'Second insert', 1) ON DUPLICATE KEY UPDATE comment=VALUES(comment), count=count+1;"; 

    mysql_query(con, query); 

    if (mysql_errno(con)) 
    { 
     fprintf(stderr, "Error: %s\n", mysql_error(con)); 
     mysql_close(con); 
     exit(1); 
    } 

    printf("Rows: %ld\n", (long) mysql_affected_rows(con)); 

    if (mysql_warning_count(con)) 
    { 
     fprintf(stderr, "Warnings: %s\n", mysql_error(con)); 
     mysql_close(con); 
     exit(1); 
    } 

    mysql_query(con, query2); 

    if (mysql_errno(con)) 
    { 
     fprintf(stderr, "Error: %s\n", mysql_error(con)); 
     mysql_close(con); 
     exit(1); 
    } 

    printf("Rows: %ld\n", (long) mysql_affected_rows(con)); 

    if (mysql_warning_count(con)) 
    { 
     fprintf(stderr, "Warnings: %s\n", mysql_error(con)); 
     mysql_close(con); 
     exit(1); 
    } 

    mysql_close(con); 
    exit(0); 
} 

Ausgabe zeigt:

Rows: 1 
Rows: 1 

Daten in der Tabelle:

mysql> select * from insert_test; 
+----+--------+------+-------+---------------+-------+ 
| id | closed | user | level | comment  | count | 
+----+--------+------+-------+---------------+-------+ 
| 5 |  0 | 1 | 50 | First insert |  1 | 
| 6 |  0 | 1 | 75 | Second insert |  1 | 
+----+--------+------+-------+---------------+-------+ 

das Programm mehrmals Lauf erhöht die count Spalte für beide Reihen. Wenn dies passiert, werden für jede Anweisung 2 Zeilen angezeigt, was normal ist.

mysql> select * from insert_test; 
+----+--------+------+-------+---------------+-------+ 
| id | closed | user | level | comment  | count | 
+----+--------+------+-------+---------------+-------+ 
| 23 |  0 | 1 | 50 | First insert |  2 | 
| 24 |  0 | 1 | 75 | Second insert |  2 | 
+----+--------+------+-------+---------------+-------+ 
Verwandte Themen