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
'programing' 카테고리의 다른 글
Varchar의 인덱스는 성능에 차이가 있습니까? (0) | 2023.07.23 |
---|---|
Python에서 "ImportError: No module name..." 오류를 해결하는 방법은 무엇입니까? (0) | 2023.07.23 |
각진 js에 사용된 것과 같은 매개 변수로 명명된 유형 스크립트? (0) | 2023.07.18 |
rm' 대신 'gitrm'을 사용하여 파일을 제거하는 이유는 무엇입니까? (0) | 2023.07.18 |
루비 온 레일즈에서 현재 절대 URL을 얻으려면 어떻게 해야 합니까? (0) | 2023.07.18 |