VeRTak
11.08.2017 - 18:03
У меня есть связи таблиц, и в данной таблице мне не нужно уникальное значение вообще, но тогда я не могу редактировать, удалять записи. Ситуация сложилась из-за того что я импортирую скриптом xml файл, так вот там нет id, и если импортировать через REPLACE, он просто не заменяет а добавляет заново по кругу все записи. И того получается повтор записей, как быть в данной ситуации?
если у тебя там нет уникальных записей - зачем же ты делаешь реплейс? просто добавляй новые.
VeRTak
12.08.2017 - 04:53
Цитата (depp @ 11.08.2017 - 21:29) |
если у тебя там нет уникальных записей - зачем же ты делаешь реплейс? просто добавляй новые. |
А старые что предлагаешь удалять? Данный вариант мне не подходит, так как в таблице есть записи которые еще добавляются с сайта
Просто суть в чем если привязать к данной таблице id, то вот что получается к примеру я импортирую файл и к примеру заканчивается на 1000 id, затем через неделю идет новый импорт и все эти 1000 id, добавляются заново, и тем самым получаются дублирующее записи
FatCat
12.08.2017 - 10:09
Значит остается одно: перед добавлением строки поиском искать эту строку, и если найдена, не добавлять.
_____________
Бесплатному сыру в дырки не заглядывают...
killer8080
12.08.2017 - 11:37
Цитата (VeRTak @ 11.08.2017 - 18:03) |
У меня есть связи таблиц, и в данной таблице мне не нужно уникальное значение вообще, но тогда я не могу редактировать, удалять записи. |
Не находишь противоречия в своих словах?
Если эти записи нужно редактировать, значит их нужно как то идентифицировать, значит первичный ключ всё таки нужен?
Цитата (VeRTak @ 12.08.2017 - 04:53) |
Просто суть в чем если привязать к данной таблице id, то вот что получается к примеру я импортирую файл и к примеру заканчивается на 1000 id, затем через неделю идет новый импорт и все эти 1000 id, добавляются заново, и тем самым получаются дублирующее записи |
кто сказал что ключ должен быть обязательно авто инкрементом? Учитывая что у входных данных нет своего идентификатора, можно использовать md5 как вариант.
ALTER TABLE `table_name` ADD `id` VARCHAR(32) NOT NULL, ADD PRIMARY KEY (`id`);
UPDATE `table_name` SET `id` = MD5(CONCAT_WS('', `field_1`, `field_2`, `field_3`,`field_n`));
таким образом ты сможешь однозначно идентифицировать записи, и даже после модификации импортированных данных в таблице избежать дублирования.
Единственный нюанс, если в таблице уже есть модифицированные относительно xml данные, такие дубли нужно будет исправить в ручную.
UPD исправил CONCAT на CONCAT_WS, первая функция возвращает NULL, если хотя бы один из аргументов NULL.
VeRTak
12.08.2017 - 12:46
killer8080, FatCatДопустим. Но
Я заливаю целый xml файл. Без какого либо парсера на стороне сервера.
LOAD XML LOCAL INFILE 'File.xml'
REPLACE
INTO TABLE test
ROWS IDENTIFIED BY '<test>'
Как то так это происходит, все проходит очень быстро что мне и нужно. И проблема всего с одной таблицей, сам файл достаточно большой. Я не хочу затрагивать парсер, всего из-за одной таблицы, вот и пытаюсь найти выход в данной ситуации.
Цитата |
и в данной таблице мне не нужно уникальное значение вообще |
похоже что все таки нужно
Есть же какие то поля которые никогда не меняются, как вариант создать составной уникальный индекс по нескольким полям, и получится если нет в базе такого, вставится, если есть произойдет замена
VeRTak
12.08.2017 - 13:10
ZSH
Вообще таблица состоит из complexid и subwayid. complexid - неизменна, а вот subwayid меняется. Но на счет уникального ключа, дело в том что complexid может быть равен 15, и таких может быть много просто с разными subwayid. Я уже думал об этом, только я вот не понял по поводу уникальности по нескольким полям, это как?
killer8080
12.08.2017 - 13:11
Цитата (VeRTak @ 12.08.2017 - 12:46) |
Я не хочу затрагивать парсер, |
и не нужно, повесь тригер на before insert и в нём генери хеш для ключа
VeRTak
12.08.2017 - 13:13
killer8080 В точку. Тригер. Как же я забыл. Спасибо. Еще же прошлой раз когда спрашивал про заливку xml рассматривал данный вариант и совсем вылетело из головы
Цитата |
только я вот не понял по поводу уникальности по нескольким полям, это как? |
создать обычный уникальный ключ только прицепить его на два поля, у тебя же как я понял complexid и subwayid если вместе их взять уникальные
killer8080
12.08.2017 - 13:21
Цитата (VeRTak @ 12.08.2017 - 13:10) |
не понял по поводу уникальности по нескольким полям, это как? |
составной индекс же
ALTER TABLE `table_name` ADD PRIMARY KEY `key_name` (`field_1`, `field_2`);
это вариант предпочтительней, при условии что комбинации этих полей уникальны
VeRTak
12.08.2017 - 13:22
Цитата (killer8080 @ 12.08.2017 - 13:21) |
это вариант предпочтительней, при условии что комбинации этих полей уникальны |
Да уникальны. Сейчас попробую
killer8080
12.08.2017 - 13:24
Цитата (VeRTak @ 12.08.2017 - 13:22) |
Да уникальны |
тогда это лучший вариант, только разрули дубли если они уже есть, перед тем как создавать индекс.
VeRTak
12.08.2017 - 13:32
killer8080 ZSH
Спасибо огромное доброе люди. Работает. И даже больше скажу, работает еще лучше чем я предполагал. Он не заменяет запись если изменился subwayid. А добавляет новую запись, что мне и нужно!
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.