Всем привет! Есть конечный результат, когда все данные разложены по полочкам. Записывает десятками тысяч записей за раз. на выходе в базе получается пара миллионов записей и в уже разложеном виде в момент записи в новую базу могут быть дубли. PHP: $result = $mysqli->query("INSERT INTO ".$db_table_to." (remote_sql_id,remote_sql_type,remote_sql_datetime,blok_01,blok_02,blok_03,blok_04,blok_05,blok_06,blok_07,blok_08,blok_09,blok_10,blok_11,blok_12,blok_13,blok_14,blok_15,blok_16,blok_17,blok_18,blok_19,blok_20,blok_21,blok_22,blok_23,blok_24,blok_25,blok_26,blok_27,blok_28,blok_29,blok_30,blok_31,blok_32,blok_33,blok_34,blok_35,blok_36,blok_37,blok_38,blok_39,blok_40,blok_41,blok_42,blok_43,blok_44,blok_45,blok_46,blok_47,blok_48,blok_49,blok_50,blok_51,blok_52,blok_53,blok_54,blok_55,blok_56,blok_57,blok_58,blok_59,blok_60,blok_61,blok_62,blok_63,blok_64,blok_65,blok_66,blok_67,blok_68,blok_69,blok_70,blok_71,blok_72,blok_73,blok_74,blok_75,blok_76,blok_77,blok_78,blok_79,blok_80,blok_81,blok_82,blok_83,blok_84,blok_85,blok_86,blok_87,blok_88,blok_89,blok_90,blok_91,blok_92,blok_93,blok_94,blok_95,blok_96,blok_97,blok_98,blok_99,blok_100) VALUES ('$data_sql01','$data_sql02','$data_sql03','$blok_01','$blok_02','$blok_03','$blok_04','$blok_05','$blok_06','$blok_07','$blok_08','$blok_09','$blok_10','$blok_11','$blok_12','$blok_13','$blok_14','$blok_15','$blok_16','$blok_17','$blok_18','$blok_19','$blok_20','$blok_21','$blok_22','$blok_23','$blok_24','$blok_25','$blok_26','$blok_27','$blok_28','$blok_29','$blok_30','$blok_31','$blok_32','$blok_33','$blok_34','$blok_35','$blok_36','$blok_37','$blok_38','$blok_39','$blok_40','$blok_41','$blok_42','$blok_43','$blok_44','$blok_45','$blok_46','$blok_47','$blok_48','$blok_49','$blok_50','$blok_51','$blok_52','$blok_53','$blok_54','$blok_55','$blok_56','$blok_57','$blok_58','$blok_59','$blok_60','$blok_61','$blok_62','$blok_63','$blok_64','$blok_65','$blok_66','$blok_67','$blok_68','$blok_69','$blok_70','$blok_71','$blok_72','$blok_73','$blok_74','$blok_75','$blok_76','$blok_77','$blok_78','$blok_79','$blok_80','$blok_81','$blok_82','$blok_83','$blok_84','$blok_85','$blok_86','$blok_87','$blok_88','$blok_89','$blok_90','$blok_91','$blok_92','$blok_93','$blok_94','$blok_95','$blok_96','$blok_97','$blok_98','$blok_99','$blok_100')"); Как проверить эту запись средствами php на уникальность и если есть дубли запись не производить?
Какую эту запись? Записи в таблице должны различаться по значению первичного ключа, уник. индекса. Все средства контроля возникновения «дублирующегося ключа» в СУБД имеются.
Примерно очень грубо говоря PHP: $dubl_01 = "01"; $dubl_02 = "02"; $dubl_03 = "03"; $dubl_04 = "04"; $dubl_05 = "05"; $dubl_06 = "06"; $dubl_07 = "07"; $dubl_08 = "08"; $dubl_09 = "09"; $dubl_10 = "10"; $dubl_blok = $dubl_01.$dubl_02.$dubl_03.$dubl_04.$dubl_05.$dubl_06.$dubl_07.$dubl_08.$dubl_09.$dubl_10; if ($dubl_blok = $dubl_blok) { echo "Совпадения зафиксированы"; echo "<br>Запись <b style='color:red;'>пропущена</b>"; } else { echo "Совпадения не найдены"; echo "<br>Запись <b style='color;green;'>выполнена</b>"; $result=$mysqli->query("INSERT INTO ".$db_table_to." (remote_sql_id,remote_sql.....куча блоков.); }
Перед разложением на блоки - изначальные данные уже выводятся с использованием "DISTINCT " $qr_result = mysql_query("SELECT DISTINCT data FROM log LIMIT 10000 OFFSET 295437); но после разложения на блоки - все равно могут появляться дубли. и вот их бы как то отсеить
ORDER BY забыли, без него БД может отдавать данные в любом удобном ей порядке, в том числе и с дублями.
$qr_result = mysql_query("SELECT DISTINCT data FROM log ORDER BY id ASC LIMIT 10000 OFFSET 295437); дубли не из за этого. Когда лог уже "дистинкнут" и разложен на кусочки, из собранных кусочков иногда собираются идентичные данные. и вот их бы как то отсеивать.
Вы ведь точно понимаете, что даже если вы добавляете DISTINCT, LIMIT/OFFSET без указания сортировки на большой выборке всё равно будет отдавать вам дубликаты (как того требует спецификация SQL)?
+1 надо гарантировать отсутствие дублей через уникальный индекс. а чтобы массовая вставка не обламывалась для всей пачки — вставлять с ignore. тогда вставится всё, что не противоречит уникальному индексу.
Если абстрагировать задачу от MySql то я бы применил https://www.php.net/manual/ru/function.array-unique.php Но вообще такое наверное лучше решать средствами mysql - установкой уникального ключа или вроде того. --- Добавлено --- Там кстати есть один прикол (или был) - если таблица не myisam - то он когда игнорит вставку - автоинкремент на первичном ключе все равно срабатывает)) я помню долго не мог понять что такое с ключами творится))))
Это, как говорится, моло*бучий фактор. Кто полагается на непрерывность нумерации в автоинкременте, тот очень рискует.
Даже откат транзакции назад все равно двигает счетчик, потому что иначе можно потерять главное свойство этой штуки - уникальность, короче, счетчик должен расти с каждым обращением к нему )
Спасибо всем за советы. Руководство пришло к выводу что задача в текущем виде поставлена неверно. Будем придумывать способ поиска и удаления дублей в конечной выгрузке. Так как не имеет смысла искать дубли в определенном блоке при записи очередных 50000 записей, так как дубли могут быть в "другой партии" записей. Если честно пока не придумал как, возможно ввести хэши к записям и по ним отлавливать...
@skorpion. ))) ты так и не понял про уникальные индексы, чувак да, почему бы и не добавить хеши. только ты придёшь в то же место: внутри одной "пачки" хеш уникален, но может повториться в другой пачке. ИСПОЛЬЗУЙ УНИКАЛЬНЫЙ ИНДЕКС И НЕ БОЙСЯ ПОВТОРОВ. ИХ НЕ БУДЕТ ПОТОМУ ЧТО ЭТО НЕВОЗМОЖНО. изучи INSERT ON DUPLICATE KEY UPDATE и INSERT IGNORE ну и REPLACE до кучи
Научись для начала помогать нормально и писать полные ответы. Твои дубликайт апдейт ничего не делают, кроме синтактической ошибки..достали --- Добавлено --- повторов не будет, но ошибки выйдут, то что в базе есть такой ключ! Помощники блин.. не умеете обьяснять, не лезьте
Форум – это не школа для тупых, а место для подсказок и обсуждений Хотите, чтобы вас за ручку водили, платите бабло «туторам».
да нет, это место помощи а не издевкам. Если не можешь помочь, идешь лесом. Никто не имеет право унижать людей, самый главный закон РФ выше которого ничего нет. Бабло платить, ну да, таким как ты? Не смеши. Были бы деньги, заплатил бы и тут не сидел. Слишком много хотите, бездарные
Ищи в ответах полезное зерно, а не издевки. Говорят, на что мы ориентированы, то и притягиваем, @ProStoNub
говорят такие же отсталые как и ты. Не дорос ты еще до человека --- Добавлено --- ахахах, бабло, какое тебе бабло....
я не удаляю тему и не баню персонажа, хотя меня уже просят. пусть он выплеснет нерастраченный негатив. переношу в соответствующий раздел.