Как проверить наличие повторяющихся значений столбцов в таблице, прежде чем вставлять их с помощью Perl? - PullRequest
1 голос
/ 27 июля 2010

Я читаю файл, который содержит запись в каждой строке. Я извлекаю содержимое файла и вставляю его в виде значений столбца в таблицу. Проблема, с которой я сталкиваюсь, состоит в том, что, если после чтения из файла я вставлю запись в таблицу, я хочу удалить дублирующиеся поля. Например:

NAME age time
Tom   21  10:30
Tom   21  12:21

После вставки в таблицу я хочу, чтобы оно было:

NAME AGE TIME
tom   21  10:30
          12:21

Это должно устранить дубликаты. Если при создании таблицы я добавляю уникальное условие, я сталкиваюсь с проблемой, заключающейся в том, что отдельное поле времени не вставляется и приводит к ошибке в MySQL.

Так как я могу это сделать? Я хочу несколько предложений.

for my $test11 (sort keys %seen) {
    my $test1 = $seen{$test11}{'name'};
    my $test2 = $seen{$test11}{'pid'};
    my $test3 = $seen{$test11}{'type'};
    my $test4 = $seen{$test11}{'time1'};
    print "$test11\t$test1$test2$test3$test4\n";
}

#sub query_execute()
{
    $db_handle = &getdb_handle;
    $sth       = $dbh->prepare("INSERT INTO tahle_new values('$sno','$id','$test1','$test4','$test2','$test3')");

$test1 и $test2 содержат дубликаты, но не $test3.

Ответы [ 3 ]

4 голосов
/ 27 июля 2010

Другой способ, это определить уникальный ключ на 2 столбца. Ваш ключ будет (Имя, Возраст) и уникальным. Поэтому при вставке вы получите сообщение об ошибке или добавите к вашему запросу: «... ON DUPLICATE KEY ...» и сделаете что-нибудь (или ничего не сделаете;))

И, как сказал ysth , я бы посоветовал вам не вставлять строку со значениями NULL в качестве второго (NULL, NULL, 12:21)

2 голосов
/ 27 июля 2010

Каждая строка должна иметь какое-то значение для каждого столбца.Вы хотите, чтобы в противном случае дубликаты были NULL?Трудно представить себе практическое использование такой таблицы.

Один из способов - иметь другую таблицу для каждого столбца, который вы хотите не дублировать, с этим столбцом в качестве уникального ключа;перед добавлением строки в основную таблицу попробуйте добавить значения столбцов в таблицы по столбцам;если есть повторяющаяся ошибка, очистите это значение, прежде чем пытаться добавить его в основную таблицу.

1 голос
/ 27 июля 2010

ysth верно, у вас не должно быть нулевых значений.Дублирование означает, что вам нужны две таблицы.Один для журнала и один для хранения информации о пользователе.

CREATE TABLE user (
    id     INTEGER   NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name   TEXT      NOT NULL,
    age    INTEGER
);

CREATE TABLE log (
    user   INTEGER REFERENCES user,
    time   TIME
);

В таблице журнала хранится целочисленный идентификатор пользователя и время (и все остальное).Вы вставили бы запись с:

$dbh->do("INSERT INTO log VALUES (?,?)", undef, $uid, $time);

. Вам нужно будет запомнить или получить идентификатор пользователя, прежде чем записывать запись в журнал.Я бы рекомендовал не использовать имя в качестве ключа, так как оно подвержено изменениям.Вы можете использовать $dbh->last_insert_id, чтобы получить это после вставки пользователя.Обратите внимание на использование параметров связывания, чтобы избежать экранирования SQL и проблем с безопасностью.

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