2017-12-09 1 views
1

나는 데이터베이스에 값을 삽입하기 위해 노력하고, 내 데이터베이스 테이블로, 나는 장치 이름 열에 대한 고유 인덱스를 생성하고있는 DB에 삽입하기 전에 여기sqlite3 및 perl에서 고유 인덱스를 만드는 방법은 무엇입니까? 즉, 새 항목이 올 때마다 있도록

$stmt = qq(CREATE TABLE IF NOT EXISTS INFO 
    (

    DeviceName    TEXT NOT NULL, 
    CurrentStatus   INT  NOT NULL, 
    ReportTime  TEXT, 
    OldStatus   INT   NOT NULL, 
    OldReportTime  TEXT   );); 

주심 동일한 이름을 가진 dB로 오히려

$stmt = qq(CREATE UNIQUE INDEX ree ON INFO(DeviceName)); 
$stmt = qq(INSERT OR REPLACE INTO INFO(DeviceName, CurrentStatus,ReportTime,OldStatus,OldReportTime) 
      VALUES ('$FQDN', $currentstatus, '$currenttime', $oldstatus, '$oldtime');); 
my $rv = $dbh->do($stmt) or die $DBI::errstr; 

이 내가 고유 인덱스를 생성하고 다음 개체가 같은 장치 이름으로 입력하면 대체하기 위해 추가 된 몇 줄 수 있습니다, 대체됩니다 삽입되지 않았습니다. 그러나 나는 이것을 따라 갔지만 데이터베이스는 여전히 같은 DeviceName을 여러 번 저장하고있다.
#!/usr/bin/perl 
use DBI; 
use strict; 
my $FQDN= "bubbly.bth.se"; 
my $currenttime = "Sat Dec 9 02:07:31 2017"; 
my $oldtime = "Sat Dec 9 02:06:31 2017"; 
my $currentstatus = "1"; 
my $oldstatus = "2"; 
my $driver = "SQLite"; 
my $database = "test.db"; 
my $dsn = "DBI:$driver:dbname=$database"; 
my $userid = ""; 
my $password = ""; 

my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) 
    or die $DBI::errstr; 
print "Opened database successfully\n"; 

$stmt = qq(CREATE TABLE IF NOT EXISTS INFO 
(

    DeviceName    TEXT NOT NULL, 
    CurrentStatus   INT  NOT NULL, 
    ReportTime  TEXT, 
    OldStatus   INT   NOT NULL, 
    OldReportTime  TEXT   );); 

my $rv = $dbh->do($stmt); 
if(my $rv < 0) { 
print $DBI::errstr; 
} else { 
print "Table created successfully\n"; 
    } 
$stmt = qq(CREATE UNIQUE INDEX ree ON INFO(DeviceName)); 
$stmt = qq(INSERT OR REPLACE INTO INFO(DeviceName, 
CurrentStatus,ReportTime,OldStatus,OldReportTime) 
      VALUES ('$FQDN', $currentstatus, '$currenttime', $oldstatus, 
'$oldtime');); 
my $rv = $dbh->do($stmt) or die $DBI::errstr; 
$dbh->disconnect(); 

NetSNMP::TrapReceiver::register("all", \&my_receiver) || 
warn "failed to register our perl trap handler\n"; 
print STDERR "Loaded the example perl snmptrapd handler\n"; 

내가 사용하고있는 코드, 내 출력

bubbly.bth.se|1|Sat Dec 9 02:07:31 2017|2|Sat Dec 9 02:06:31 2017 
bubbly.bth.se|1|Sat Dec 9 02:07:31 2017|2|Sat Dec 9 02:06:31 2017 
bubbly.bth.se|1|Sat Dec 9 02:07:31 2017|2|Sat Dec 9 02:06:31 2017 
bubbly.bth.se|1|Sat Dec 9 02:07:31 2017|2|Sat Dec 9 02:06:31 2017 
bubbly.bth.se|1|Sat Dec 9 02:07:31 2017|2|Sat Dec 9 02:06:31 2017 

이다 그러나이 같은 장치 이름을 발견하면 내가 때마다 대체 업데이트 또는 데이터베이스에서 하나 개의 행을하고 싶어 .

참고 : 가변 값은 쉽게 이해하기 위해 취해진 것입니다.

답변

6

실제로 색인을 만들지는 마십시오.

$dbh->do(qq(CREATE UNIQUE INDEX ree ON INFO(DeviceName))); 

청소 버전

$stmt = qq(CREATE UNIQUE INDEX ree ON INFO(DeviceName)); 

교체 :

#!/usr/bin/perl 

use strict; 
use warnings qw(all); 

use DBI qw(); 

my $database = "test.db"; 
my $dsn = "dbi:sqlite:dbname=$database"; 

my $dbh = DBI->connect($dsn, undef, undef, 
    { 
     RaiseError => 1, 
     PrintError => 0, 
     PrintWarn => 1, 
     AutoCommit => 1, 
    }, 
); 

$dbh->do(q{ 
    CREATE TABLE IF NOT EXISTS INFO (
      DeviceName  TEXT NOT NULL, 
      CurrentStatus INT NOT NULL, 
      ReportTime  TEXT, 
      OldStatus  INT NOT NULL, 
      OldReportTime TEXT 
     ) 
}); 

$dbh->do(q{ CREATE UNIQUE INDEX ree ON INFO (DeviceName) }); 

my $FQDN   = "bubbly.bth.se"; 
my $currenttime = "Sat Dec 9 02:07:31 2017"; 
my $oldtime  = "Sat Dec 9 02:06:31 2017"; 
my $currentstatus = "1"; 
my $oldstatus  = "2"; 

$dbh->do(
    q{ 
     INSERT OR REPLACE INTO INFO (
       DeviceName, 
       CurrentStatus, 
       ReportTime, 
       OldStatus, 
       OldReportTime 
      ) VALUES (
       ?, ?, ?, ?, ? 
      ) 
    }, 
    undef, 
    $FQDN, $currentstatus, $currenttime, $oldstatus, $oldtime 
); 

$dbh->disconnect(); 
  • 항상 use warnings qw(all);를 사용합니다.
  • INSERT 문을 잘못 작성했습니다 (주입 버그).
  • 들여 쓰기 및 간격이 좁습니다.
  • RaiseError => 1이 있으므로 DBI 메소드가 오류를 반환하는지 확인하는 것은 의미가 없습니다.
  • RaiseError => 1이 있으므로 PrintError => 1을 사용하는 것이 좋습니다.
+0

안녕하십니까, 답장을 보내 주셔서 감사합니다. 여기에 귀하의 솔루션 코드는 DeviceName이 동일한 지 확인하고 동일하면 그냥 행을 만들지 않지만 제 경우에는 새로 테이블을 업데이트하려고합니다. 오는 정보, 매번 DeviceName 만 같지만 다른 열은 시간이 바뀔 때마다 시간이 바뀌기 때문에 필요 정보가 데이터베이스에 들어올 때마다 동일한 업데이트가있을 경우 DeviceName을 확인해야합니다. INSERT, –

+0

설명에서 필자는 메모를 언급했습니다. 변수 값은 쉽게 이해하기 위해 취해진 것입니다. 이는 다른 컬럼이 변경된 이름을 제외하고, 때때로 DeviceName도 변경된다는 것을 의미합니다. 그러면 else update를 삽입해야합니다. 고맙습니다 사전에 –

+0

귀하의 의견 중 하나의 요점을 이해하지 않습니다. – ikegami

관련 문제