[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с дублированием записей в БД
garyk
Подскажите пожалуйста как создать запрос на добавление, чтобы не добавлялись уже существующие записи в БД.



Спустя 10 минут, 29 секунд (5.05.2010 - 22:43) zarafar написал(а):
Мб сначала проверить, есть ли уже данные в бд ? smile.gif

Спустя 1 час, 45 минут, 14 секунд (6.05.2010 - 00:28) sergeiss написал(а):
Если речь идет о БД MySQL, то достаточно открыть (любое) описание для команды вставки INSERT. Там есть не обязательный параметр ON DUPLICATE KEY... Как раз твой случай.

Спустя 8 часов, 56 минут, 57 секунд (6.05.2010 - 09:25) garyk написал(а):
Спасибо за советы. Буду пробовать

Спустя 1 минута, 19 секунд (6.05.2010 - 09:26) garyk написал(а):
Цитата (zarafar @ 5.05.2010 - 19:43)
Мб сначала проверить, есть ли уже данные в бд ?  smile.gif

Каким образом сделать эту проверку?

Спустя 6 часов, 8 минут, 13 секунд (6.05.2010 - 15:34) zarafar написал(а):
Цитата (garyk @ 6.05.2010 - 06:26)
Цитата (zarafar @ 5.05.2010 - 19:43)
Мб сначала проверить, есть ли уже данные в бд ?  smile.gif

Каким образом сделать эту проверку?

Я ошибся, давно не работал с БД, были сомнения и все равно не посмотрел сначала в мануал, каюсь smile.gif Правильно вот так :
Цитата
#
Если в команде INSERT со строками, имеющими много значений, указывается ключевое слово IGNORE, то все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы и не будут внесены. Если не указывать IGNORE, то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа. Количество строк, внесенных в данную таблицу, можно определить при помощи функции C API mysql_info().

#
Если вы указываете ON DUPLICATE KEY UPDATE (новшество в MySQL 4.1.0), и производится вставка строки, которая вызывает ошибку дублирующегося первичного (PRIMARY) или уникального (UNIQUE) ключа, то вполняется UPDATE старой строки.

Cуществует еще такой оператор:
Цитата
Оператор REPLACE работает точно так же, как INSERT, за исключением того, что если старая запись в данной таблице имеет то же значение индекса UNIQUE или PRIMARY KEY, что и новая, то старая запись перед занесением новой будет удалена.
Дугими словами, команда REPLACE не предоставляет доступа к замещаемой записи. В некоторых старых версиях MySQL такой доступ иногда оказывался возможным, но это был дефект, который уже исправлен.
Следует учитывать, что, если не используются индексы UNIQUE или PRIMARY KEY, то применение команды REPLACE не имеет смысла, так как она работает просто как INSERT.

Если нужно, чтобы просто не добавлялись уже существующие записи, то так:
INSERT IGNORE INTO TableName (col1, col2) VALUES ('value1', 'value2') 

Если запись существует и её нужно обновить, то так :
INSERT INTO TableName (col1, col2) VALUES ('value1', 'value2') ON DUPLICATE KEY UPDATE  col1 = 'value3' 



Спустя 12 минут, 59 секунд (6.05.2010 - 15:47) garyk написал(а):
Дело в том что у меня нет уникальных полей. Есн-но ON DUPLICATE KEY UPDATE отпадает. Надо создать запрос типо INSERT.....SELECT.

$sql="insert into log values('','".$result[0][0]."',
'"
.substr($result1[0][0], 1, strlen($result1[1][0])-1)."',
'"
. substr($result2[0][0], 2, strlen($result2[1][0])-2)."',
'"
. substr($result3[0][0], 1, strlen($result3[1][0])-2)."',
'"
. substr($result4[0][0], 2)."','".date('Y-m-d H:i:s',$t)."')

сюда надо добавить что топо Select Count(*) from Log Where Date='$date'
if число строк >0, тогда ничего не делать иначе вставка записи до тех пор пока не встретим след.дату

Спустя 5 минут, 15 секунд (6.05.2010 - 15:53) zarafar написал(а):
Можете показать структуру вашей таблицы ?

Спустя 8 минут, 9 секунд (6.05.2010 - 16:01) sergeiss написал(а):
Еще вариант - использовать триггер вставки данных. В обработчике триггера проверяй, нет ли уже записи, по твоим критериям. И если есть, то отказывайся от вставки данной строки. Как именно это сделать - читай описалово для триггера.

Спустя 4 часа, 36 минут, 11 секунд (6.05.2010 - 20:37) garyk написал(а):
Там на картинке таблица. Вот кусок моего лога-
Tue Mar 2 17:50:02 MSK 2010
office3.ib.komisc.ru (172.19.14.3) at 00:11:09:FA:A8:A7 [ether] on eth1
ksc.komisc.ru (195.19.158.1) at 00:1C:C4:79:D3:EE [ether] on eth0
analit2.ib.komisc.ru (172.19.3.2) at 00:C0:DF:0F:FC:78 [ether] on eth1
office249.ib.komisc.ru (172.19.14.249) at 00:1E:EC:59:DF:D9 [ether] on eth1
pochva51.ib.komisc.ru (172.19.15.51) at 00:1D:7D:D9:E6:E9 [ether] on eth1
bot5.ib.komisc.ru (172.19.5.5) at 00:10:22:FF:0A:61 [ether] on eth1
gis35.ib.komisc.ru (172.19.13.35) at 00:24:1D:84:3C:B1 [ether] on eth1
? (172.20.1.2) at 00:04:35:00:0D:0C [ether] on eth1
geo14.ib.komisc.ru (172.19.9.14) at 00:80:48:26:29:95 [ether] on eth1
analit4.ib.komisc.ru (172.19.3.4) at 00:16:E6:64:7E:47 [ether] on eth1
Tue Mar 2 17:52:01 MSK 2010
office3.ib.komisc.ru (172.19.14.3) at 00:11:09:FA:A8:A7 [ether] on eth1
server51.ib.komisc.ru (172.19.1.51) at 00:01:80:39:0E:4A [ether] on eth1
office30.ib.komisc.ru (172.19.14.30) at 00:11:09:FA:A6:49 [ether] on eth1
Вот код который я использую-

<?php
$link_DB=mysql_connect("localhost","root","")or die("Ошибка Соединения с БД!!!");
mysql_select_db("diplom",$link_DB);
$h = fopen("1.log","r"); // открытие файла для чтения
while (!feof ($h)) { // проверка. смотрит ли указатель позиции файла на конец файла
$content = fgets($h);
$pattern = "/(\?|\S.+\.ru)/m"; // поиск Host'а
$num_match = preg_match_all ($pattern,$content, $result);
if ($num_match==0){echo $content . "<br>";
$t=strtotime ($content);
}
else{
$pattern = "/\(.+\)/m"; // поиск IP'шника
$num_match = preg_match_all ($pattern,$content, $result1);
$pattern = "/at .+\[/m"; // поиск MAC'а
$num_match = preg_match_all ($pattern,$content, $result2);
$pattern = "/(\[.+\]|<.+>)/m"; // поиск Тип подключения
$num_match = preg_match_all ($pattern,$content, $result3);
$pattern = "/on \w\w\w\w/m"; // поиск Интерфейс
$num_match = preg_match_all ($pattern,$content, $result4);
$sql="insert into log values('','".$result[0][0]."',
'"
.substr($result1[0][0], 1, strlen($result1[1][0])-1)."',
'"
. substr($result2[0][0], 2, strlen($result2[1][0])-2)."',
'"
. substr($result3[0][0], 1, strlen($result3[1][0])-2)."',
'"
. substr($result4[0][0], 2)."','".date('Y-m-d H:i:s',$t)."')";
mysql_query($sql);
echo $result[0][0]." | ". // показ Host
substr($result1[0][0], 1, strlen($result1[1][0])-1). " | ". // показ IP
substr($result2[0][0], 2, strlen($result2[1][0])-2). " | ". // показ MAC
substr($result3[0][0], 1, strlen($result3[1][0])-2). " | ". // показ Тип подключения
substr($result4[0][0], 2). // показ Интерфейс
"<br>";}
}

fclose($h);
?>

Спустя 1 день, 21 час, 33 минуты, 30 секунд (8.05.2010 - 18:10) garyk написал(а):
не уж то ни у кого нет соображений по данному поводу?
мне наверно надо сначало сделать выборку, а потом встаку вот тока не могу разобраться. хелп ми плиз
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.