programing

perl - 데이터베이스에서 여러 요청을 보냅니다.

megabox 2023. 7. 23. 14:09
반응형

perl - 데이터베이스에서 여러 요청을 보냅니다.

나는 펄에 이 스크립트를 가지고 있고, 이 프로그램은 로그 파일을 구문 분석하고 데이터베이스에 결과를 보냅니다. 나의 문제는 스크립트가 하나의 요청만 삽입하는 것입니다. 나는 여러 요청을 삽입해야 합니다.

#Connect to the database.
my $dbh = DBI->connect("DBI:mysql:database=database;host=IP",
"hostname", 'password',
{'RaiseError' => 1});



while (my ($user, $ref) = each %counts) {
  while (my ($program, $count) = each %$ref) {
    #print "$count OSUSER with session $user and with program $program\n";
    print "time = $time, count = $count, user = $user, program = $program, last_line = $last_line\n";

    $request ="'$time', '$count', '$user', '$program', $last_line";

    my $sth = $dbh->prepare("REPLACE `test` (time, nb, os_name, program, last_line) VALUES($request);")
    or die "prepare statement failed: $dbh->errstr()";

    $sth->execute() or die "execution failed: $dbh->errstr()";
    print $sth->rows . " rows found.\n";
    $sth->finish;
  }
}

내 로그:

       ID USER                    TERMINAL        SERVICE                    
---------- ------------------------- --------------- -------------------------  
         1 toto                    titi     roro          
         2 toto                    titi     roro          
         4 gigi                    gege        fefe      

내 데이터베이스:

+----+---------------------+-----------+-------------+----------------+-----------+
| ID | time                | nb        | os_name     | program        | last_line |
+----+---------------------+-----------+-------------+----------------+-----------+
| 15  | 2019-01-04 14:00:00|        33 | titi        | roro           | 109       |

나는 원합니다:

+----+---------------------+-----------+-------------+----------------+-----------+
| ID | time                | nb        | os_name     | program        | last_line |
+----+---------------------+-----------+-------------+----------------+-----------+
| 15  | 2019-01-04 14:00:00|        33 | titi        | roro           | 109       |
| 16  | 2019-01-04 14:00:00|        9  | gege        | fefe           | 109       |      

(Dave Cross에 의해 추가됨 - 코멘트에서 복사됨.다음은 테이블 정의입니다.)

CREATE TABLE test (
  ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
  time datetime NOT NULL,
  nb int NOT NULL,
  os_name nvarchar(100) NOT NULL,
  program nvarchar(100) NOT NULL,
  last_line nvarchar(100)NOT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY (time)
) ENGINE=InnoDB;

주석에서 테이블 정의에는 다음이 포함됩니다.

UNIQUE KEY (time)

따라서 테이블은 모든 값에 대해 단일 행만 포함할 수 있습니다.time.

또한 사용자는REPLACE사용자의 SQL에서.따라서 문을 두 번째로 실행할 때 데이터베이스는 동일한 고유 키를 가진 기존 행이 있음을 확인하므로 새 행을 삽입하는 대신 해당 행을 업데이트합니다.

당신의 코드가 정확히 예상대로 작동하는 것 같습니다.행을 더 추가하려면 의 값을 변경해야 합니다.$time.

업데이트:

다른 답변에 대한 귀하의 의견에서.

INSERT로 테스트했지만 작동하지 않습니다: DBD::mysql::st 실행 실패:키 '시간'에 대한 중복 항목 '2019-01-04 17:45:00'

네! 그게 바로 일어나야 할 일입니다.당신을 선언함으로써time로 열을 올리다.UNIQUE각 시간 값은 테이블에서 한 번만 발생할 수 있다고 데이터베이스에 말하고 있습니다.따라서 시간이 같은 다른 행을 삽입하려고 하면 오류가 발생합니다.

그래서 당신은 전환합니다.INSERT로.REPLACE그리고 오류는 없지만 한 줄만 삽입됩니다. 왜냐하면 그것이 바로 그것이기 때문입니다.REPLACE한다.

표에서 원하는 항목의 예제는 시간 열에 동일한 두 개의 값이 있습니다.그것은 당신이 가지고 있는 동안 일어날 수 없습니다.UNIQUE해당 열에 정의가 있습니다.그것이 바로 그것입니다.UNIQUE열쇠는 예방할 수 있는 것입니다.

여러분은 한 발 물러서서 여러분이 테이블에서 무엇을 원하는지 정확히 생각해 볼 필요가 있습니다.표에 중복된 시간 값을 사용하려면 다음을 제거해야 합니다.UNIQUE표의 키 정의(그리고 변경)REPLACE와 함께INSERT).

다음에 대한 설명서:

REPLACE와 똑같이 작동합니다.INSERT테이블의 오래된 행이 새 행과 동일한 값을 갖는 경우 제외PRIMARY KEY 새 행을 삽입하기 전에 이전 행이 삭제됩니다.

(강조: 나)

바로 그겁니다.당신은 같은 시간을 가지고 있습니다.2019-01-04 14:00:00두 번. 언제.REPLACE두 번째 것은 첫 번째 것이 삭제됩니다.

제시도거에서 고유 .time.

언급URL : https://stackoverflow.com/questions/54042288/perl-send-multiple-request-in-database

반응형