PHP MySQLi - insert_id 0 после вставки или обновления - следует ли сначала прочитать?

Я все еще новичок, и некоторые из правильных методов кодирования ускользают от меня. Документация по этой конкретной ситуации слаба, поэтому я хотел бы получить несколько советов/предложений от вас, экспертов :) по следующему.

У меня есть API, который позволяет пользователям обновлять 2 таблицы за один вызов. Одна представляет собой таблицу SUMMARY, а другая — таблицу DETAIL с FK для таблицы SUMMARY.

Мой код делает то, что я делаю UPSERT (вставка/обновление) в таблицу SUMMARY, беру insert_id и затем удаляю записи из таблицы DETAIL, затем вставляю те, которые мне нужны (конечно, со ссылкой на SUMMARY с буквой fk).

Однако в случае отсутствия изменений в СУММАРНЫХ данных - insert_id возвращает 0. Это кажется ожидаемым, так как ни одна строка не была обновлена/вставлена.

Вот мой вопрос:

Должен ли я выполнять полное чтение таблиц и сравнивать данные перед этой попыткой обновления/удаления/вставки? Или есть другой изящный способ получить id из SUMMARY, который был дубликатом попытки UPSERT? Я чувствую, что мои пользователи будут «почти» ВСЕГДА изменять данные SUMMARY и DETAIL при использовании этого API.

Какова правильная практика кодирования здесь? Стоит ли дополнительное чтение каждый раз? Или читать только если insert_id = 0?

Мысли? Моя самая большая проблема заключается в том, что я не знаю, какова здесь разница в величине чтения и записи, особенно потому, что я не верю, что API будет вызываться много раз без изменения значений.

Опять мои варианты:

    • Read db and compare to see if there is a diff
    • Вставить/обновить соответственно
    • Attempt Insert/update.
    • если (insert_id = 0), то прочитайте БД, чтобы получить итоговый идентификатор для таблицы сведений
    • полный процесс
    • Attempt Insert/Update
    • использовать? что-то? чтобы получить идентификатор сводки записи, которая была дублирована (и предотвратила вставку/обновление)
    • используйте идентификатор для выполнения шагов.

person NEW2WEB    schedule 08.08.2014    source источник
comment
Просто перечитайте. Сказать, что документация слабая, вероятно, будет ошибкой. Тем не менее, я борюсь, вероятно, потому, что не знаю, что искать.   -  person NEW2WEB    schedule 08.08.2014


Ответы (2)


Если идентификатор, который вам нужен, представляет собой поле auto_increment, вариант 4 (делать все внутри БД с 1 действием выполнения) 100% времени. Это общая структура SQL, которая вам нужна:

Insert into summary (primaryKey, fieldA, fieldB) values (NULL, valueA, valueB) on duplicate key update primaryKey=LAST_INSERT_ID(primaryKey), fieldA = fieldA, fieldB=fieldB;

Если вы затем сделаете SELECT LAST_INSERT_ID(), это даст вам либо успешно вставленный идентификатор, либо, если дублируется, дублирующийся идентификатор записи. Итак, сделайте что-то вроде:

delete from detail where summary_id = LAST_INSERT_ID();

person Jacky Cheng    schedule 08.08.2014

В компаниях, в которых я работал, вариант 1 обычно используется, если вы хотите сравнить запись за записью. Это может быть реализовано либо в хранимой процедуре, либо в самом коде. Зависит от контекста того, что означает «то же самое». Если это необработанные значения, то sql, вероятно, самый простой. Если есть контекст в дополнение к тому, что есть в базе данных, вы захотите сделать это на уровне кода. Надеюсь, это поможет.

person Rachael    schedule 08.08.2014