2016-10-31 2 views
3

나는 다음과 같은 테이블이 : 나는 명령 행에서 다음 명령을 실행하면는 mysql_query() 동작은 명령 줄에서 MySQL과 다른

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) 
) 

가 :

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; 

을 ...이입니다 출력 내가 얻을 :

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

내가 mysql_query()를 사용하여이 명령을 실행하면, 이것이 내가 무엇을 얻을 수 있습니다.

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

그래서 쿼리를 업데이트하는 대신 나는 mysql_query() 기능을 사용할 때 안하면 두 삽입이 다른 수준을 가지고 있고 그래서 그들은 고유 때문에 바로 ..., 새 행을 삽입한다? 내가 잘못 했는가, 아니면 여기에 뭔가가있는가?

편집 : 나는 그것을 사용 정확히 코드 조각은 다음과 같습니다

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); 

내가 링크가 올바른지 알고는 제외하고 (즉, 쿼리가 실행) 작업을 수행하기 때문에이 코드가 실행되고 있음을 삽입하는 대신 업데이트하는 위치를 지정하십시오.

+5

mysql_query()를 실행하면 코드 스 니펫을 공유 할 수 있습니까? – dchayka

+2

** 경고 ** : PHP를 배우려는 분이라면 [mysql_query'] (http://php.net/manual/en/function.mysql-query.php) 인터페이스를 사용하지 마십시오. PHP 7에서 제거 된 것은 너무 무섭고 위험합니다. [PDO는 배우기가 어렵지 않습니다.] (http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps -pdo-for-database-access /)와 [PHP The Right Way] (http://www.phptherightway.com/)와 같은 가이드가 모범 사례를 설명합니다. – tadman

+1

위에 코드 스 니펫을 달았습니다. 더 필요한 경우 알려주세요. 그리고 내가 언급 했어야하는데, 이것은 PHP가 아니라 C입니다. – user2073805

답변

1

문제점을 재현 할 수 없습니다. 난 그냥 위의 테이블 (간단한 테스트 케이스를 작성해 주셔서 감사합니다), 그리고 빠른 C 프로그램으로 이것을 테스트했습니다. 예상대로 작동하여 두 행을 삽입했습니다. 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); 
} 

출력 보여준다 테이블

Rows: 1 
Rows: 1 

데이터 :

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 | 
+----+--------+------+-------+---------------+-------+ 

프로그램을 여러 번 실행 모두 count 행에 대한 열을 증가시킨다. 이 경우, 각 명령문에 대해 영향을받는 2 행이 표시되며 이는 정상입니다.

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 | 
+----+--------+------+-------+---------------+-------+