Создание нескольких записей с проверкой повторения

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Создание нескольких записей с проверкой повторения

Сообщение ALX_2002 » 14.03.2006 (Вт) 13:44

2 all: Доброго времени и т.п :wink:

Вопрос ламерский, но всё же.

Я создаю в базе (MDB) подряд несколько записей.
С полями:

ID, NAME, SIZE, CONTENT

NAME повторяться не должен

Для каждой записи мне нужно выполнить условие:

Если запись с таким NAME уже существует , то перезаписывать, а если нет, то создавать новую.


Вопрос: Что лучше сделать - На каждую запись выполнять SELECT и проверять количество возвращённых или сделать NAME ключевым полем и проверять ошибку создания записи и по ней делать вывод о создании записи ?

Или же есть ещё варианты ? :roll:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Создание нескольких записей с проверкой повторения

Сообщение Andrey Fedorov » 14.03.2006 (Вт) 15:16

ALX_2002 писал(а):Или же есть ещё варианты ? :roll:


Для Name установить:

Индексированное поле (Совпадения не допускаются):
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.03.2006 (Вт) 15:20

Andrey Fedorov, это, в принципе, и есть второе решение, о котором спрашивалось.
Не знаю, насколько это правильно, но я бы проверял на дубликаты перед вставкой каждой строки. Ествественно, не select-ом, а поставив уникальный индекс на NAME и производя поиск по нему.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.03.2006 (Вт) 15:25

alibek писал(а):Не знаю, насколько это правильно, но я бы проверял на дубликаты перед вставкой каждой строки. Ествественно, не select-ом, а поставив уникальный индекс на NAME и производя поиск по нему.


Не есть правильно.

Зачем делать лишнюю проверку если индекс и так уникален?
Получим ошибку и сообщим о ней пользователю.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.03.2006 (Вт) 15:27

Если запись уже будет, то уникальный индекс не даст создать дубликат.
Просто это дополнительная мера, чтобы не генерить ошибки без надобности.

P.S. Нечестно это, редактировать сообщения :)
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.03.2006 (Вт) 15:28

Вдобавок, в таком случае можно добавить не-дубликаты и сообщить пользователю о записях, которые не были добавлены.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.03.2006 (Вт) 15:30

alibek писал(а):Если запись уже будет, то уникальный индекс не даст создать дубликат.
Просто это дополнительная мера, чтобы не генерить ошибки без надобности.


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

alibek писал(а):P.S. Нечестно это, редактировать сообщения :)


Дык не чужие-же :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.03.2006 (Вт) 15:40

alibek писал(а):Вдобавок, в таком случае можно добавить не-дубликаты и сообщить пользователю о записях, которые не были добавлены.


Это при одновременном добавлении/обновлении нескольких записей?
Дык можно сделать в любом случае - дополнительные запросы тут опять же не нужны - см. Filter Property. :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.03.2006 (Вт) 17:05

Красивое решение мне известно только для MySQL -
Код: Выделить всё
INSERT INTO ...
VALUES ...
ON DUPLICATE KEY UPDATE ...


Для access, всё-таки, имхо уникальный индекс на имя и потом проверка, ибо проверка при наличии уникального индекса происходит очень быстро...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.03.2006 (Вт) 17:13

GSerg писал(а):Для access, всё-таки, имхо уникальный индекс на имя и потом проверка, ибо проверка при наличии уникального индекса происходит очень быстро...


А просто обработка ошибки (которой может и не быть в большинстве случаев) значит дольше?

То бишь

INSERT

выполняется дольше чем

SELECT ... ' Проверка
INSERT ...

:lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.03.2006 (Вт) 17:26

Неа, не INSERT, а
INSERT 'Ошибка
UPDATE

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

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.03.2006 (Вт) 17:34

GSerg писал(а):Неа, не INSERT, а
INSERT 'Ошибка
UPDATE


А зачем UPDATE-то если INSERT стоит?

GSerg писал(а):Просто - я думаю - проверка будет всё равно, только на стороне пользователя или базы. А поскольку она всё равно будет, то лучше с ней, но без эксепшена...


Проверка осуществляется собственно индексом.
Ошибка возникает только в случае дубликатов.
Ну и зачем тут еще какая-то проверка?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.03.2006 (Вт) 17:48

Ну вопрос был - если записи нет, вставить, если есть, обновить.
Как обновить, если не UPDATE?

DELETE + INSERT?

Хм... А кстати, вариант, и будет работать без эксепшена :)
DELETE ... WHERE name ='..';
INSERT ...;
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.03.2006 (Вт) 17:58

GSerg писал(а):Ну вопрос был - если записи нет, вставить, если есть, обновить. Как обновить, если не UPDATE?


Можно, кстати, и в таком порядке:

Код: Выделить всё
cn.Execute "UPDATE ... WHERE [Name] LIKE """ & REPLACE(s,"""","""""") & """", i
if i=0 Then cn.Execute "INSERT ..."
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 14.03.2006 (Вт) 20:34

Уууу челы, как всё сложно то :shock: . Я теперь совсем в замешательстве чего выбрать. "Буду посмотреть" - как говорится :lol:

Спасибо вам всем !!! :D Я тогда ещё к вам с вопросиками загляну. :roll:


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList