Perl - отправить несколько запросов в базе данных - PullRequest
0 голосов
/ 04 января 2019

У меня есть этот скрипт на 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       |      

(добавлено Дейвом Кроссом - скопировано из комментария. Вот определение таблицы.)

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;

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Из руководства для REPLACE:

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для индекса PRIMARY KEY или UNIQUE, старая строка удаляется перед вставкой новой строки .

(Акцент: Я)

Вот, пожалуйста. У вас есть одно и то же время 2019-01-04 14:00:00 дважды. Когда REPLACE второй, первый удаляется

Попробуйте удалить уникальный индекс на time.

0 голосов
/ 04 января 2019

Ваше определение таблицы (из комментария) включает в себя:

UNIQUE KEY (time)

Таким образом, ваша таблица может содержать только одну строку для любого значения time.

Кроме того, вы используете REPLACE в своем SQL. Поэтому, когда вы выполняете свой оператор во второй раз, ваша база данных обнаруживает, что существует существующая строка с тем же уникальным ключом, поэтому обновляет строку, а не вставляет новую.

Мне кажется, что ваш код работает точно так, как ожидалось. Если вы хотите добавить больше строк, вам нужно изменить значение в $time.

Обновление:

Из вашего комментария к другому ответу.

Я тестировал с INSERT, но не работает: DBD :: mysql :: st выполнить не удалось: Дублирующаяся запись '2019-01-04 17:45:00' для ключа 'time'

Да! Это именно то, что должно произойти. Объявляя вам time столбец как UNIQUE, вы сообщаете своей базе данных, что каждое временное значение может встречаться в вашей таблице только один раз. Поэтому, если вы попытаетесь вставить другую строку с тем же временем (что вы и делаете), вы получите эту ошибку.

Таким образом, вы переключаетесь с INSERT на REPLACE, и вы не получаете ошибки, а вставляете только одну строку - потому что именно это REPLACE делает.

В приведенном вами примере того, что вы хотите в таблице, в столбце времени есть два одинаковых значения. Это не может произойти, пока у вас есть определение UNIQUE в этом столбце. Это именно то, что есть кнопка UNIQUE, чтобы предотвратить.

Вам нужно отступить назад и подумать, что именно вы хотите в таблице. Если вы хотите дублировать значения времени в таблице, вам нужно удалить определение ключа UNIQUE в таблице (а затем изменить REPLACE на INSERT).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...