[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверять перед добавлением в БД или нет
z3r9
Здравствуйте. Такой вопрос при добавлении в БД может быть много исключительных ситуаций, например в БД есть уникальный индекс (типа когда 2 поля не должны повторятся), или там не может быть значение null и так далее.

Может кто-то сталкивался, как лучше в таком случае действовать:
1) проверять все возможные исключительные ситуации и потом добавлять уже без ошибок. Я понимаю когда исключительную ситуацию можно исправить, тогда конечно нужно в коде исправлять.
2) Просто сразу добавлять запись в БД и отлавливать через try catch.

Вопрос в том как лучше действовать, какие плюсы и минусы в этих способах?
Valick
Всё зависит от самого уникального индекса. Иногда достаточно INSERT IGNORE , а иногда приходится возится с транзакциями.

_____________
Стимулятор ~yoomoney - 41001303250491
z3r9
Цитата (Valick @ 23.01.2023 - 23:24)
Всё зависит от самого уникального индекса. Иногда достаточно INSERT IGNORE , а иногда приходится возится с транзакциями.

Не совсем вы поняли что имею ввиду. Там вообще имеется в общем но приведу конкретный пример есть уникальный индекс и нужна проверка на уникальность.
Как действовать:
1. Проверять перед добавлением на уникальность. В этом случае все равно есть запрос в БД.
2. Просто добавлять и отлавливать ошибку.
Valick
z3r9, не вынуждайте меня повторять по два раза.

1. Проверять перед добавлением на уникальность. В этом случае все равно есть запрос в БД.
Между выбрркой (проверкой) SELECT и вставкой нового значения INSERT может вклиниться другой процесс, который встатвит точно такое-же значение. Поэтому см. что такое транзакции.

2. Просто добавлять и отлавливать ошибку.
Что бы не отлавливать ошибки их просто не надо создавать. Поэтому см. что такое INSERT IGNORE

Какой из этих методов применять напрямую зависит от сущности поля уникального индекса.

_____________
Стимулятор ~yoomoney - 41001303250491
kirik
1. insert on duplicate key update
2. то что Valick прописал insert ignore
3. ну и транзакции

Если речь про MySQL: имейте ввиду, если в таблице присутсвует AutoIncrement'ный ключ - он будет инкрементиться вне зависимости от того, произошла ли вставка. Т.е если вставить 100 одинаковых строк с insert ignore/on duplicate key - то вставится одна строка, но значение AI будет +100.

Конечное решение зависит от юзкейса. Если вы уверены, что у вас будет много вставок, которые наткнутся на дубликаты - то хорошее решение - select перед insert. Если дубликаты редкость - то просто insert. Если вам важен факт наличия дубликата при insert - ловите ошибку с соответствующем кодом, если не важен - insert ignore.

Лично я транзакции избегаю - с ними много неоправданной возни (для веба). Но если вы пишете что-то финансовое, где консистентность в приоритете, то конечно никуда не деться от них.
rgl
Если есть уникальный индекс, а вы пытаетесь добавить INSERT запись с тем же индексом, будет ошибка. Как избежать ошибки? Это зависит от того, что вы хотите.
1. Просто проигнорировать, т.е. не добавлять но и чтобы ошибки не было. Тогда используйте INSERT IGNORE
2. Добавить новую запись вместо старой. Тогда используйте REPLACE вместо INSERT. Также REPLACE можно использовать вместо UPDATE, гораздо проще записывается, хотя не знаю как это влияет на эффективность
don.bidon
Я бы в try/catch обернул и не грел голову.
FatCat
Не понял сути обсуждения.
Если я добавляю новую запись, я не указываю ее уникальный айдишник, БД сама присваивает следующий по инкременту.

Если какое-то значение должно быть уникальным, например, артикул товара, тогда да, проверка.

_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

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