Вопрос

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

Это было полезно?

Решение

Вы можете увидеть разницу между двумя таблицами следующим образом:

  

SELECT * FROM tableFoo
    ВЛЕВО СОЕДИНИТЬ tableBar ON tableFoo.commonColumn = tableBar.commonColumn
    ГДЕ tableBar.commonColumn НЕДЕЙСТВИТЕЛЕН

Идея состоит в том, что в обеих таблицах есть сопоставляемый столбец, а записи, которые объединяются, когда столбец равен нулю, являются записями, которые присутствуют только в tableBar.

Причина, по которой это работает, заключается в том, что левые объединения возвращают записи, даже если одна из таблиц имеет нулевые значения, в отличие от внутреннего соединения, которое делает обратное.

После того, как вы получите эти записи, вы можете вставить их на основе возвращенных идентификаторов.

Другие советы

вставляйте только записи, не входящие в другую таблицу, либо с помощью предложения NOT EXISTS , либо путем объединения и фильтрации всех записей not-NULL из результата

Лучший способ - использовать общий ключ (или использовать ключ первой таблицы как ведущую часть ключа второй таблицы). Таким образом, вы просто выбираете строки из TABLE1, где NOT EXISTS в таблице 2.

Лучшая альтернатива, если вам нужно каким-то образом преобразовать ключ, это использовать триггер вставки в TABLE1: когда вы вставляете туда строки, триггер срабатывает, и вы можете вставлять данные в TABLE2. Это имеет преимущество - и недостаток - использования одной транзакции. Преимущество заключается в том, что вы сохраняете непротиворечивость данных, что является недостатком, если TABLE2 используется для отчетов или других несущественных целей.

НЕ решайте использовать флаг в TABLE1, который указывает, что строка была вставлена. Это не только логично, но и физически, потому что вы связываете данные в таблице с процессом, который использует таблицу.

Есть два метода, которые я часто использую. В зависимости от характера таблицы, один из способов может быть лучше другого, однако, если вы выберете номер 2, есть вероятность улучшить структуру таблицы.

1.) Убедитесь, что ваши таблицы проиндексированы и имеют хороший первичный ключ. Выберите все записи из таблицы1, где первичный ключ не существует в таблице2. Это работает для нормализованных таблиц

2.) Если ваши таблицы не нормализованы и не имеют хороших ключей, вы можете добавить ProcessedDate к table1. Вставьте все записи с нулевым значением ProcessDate, затем установите для ProcessDate текущую дату и время. Вам просто нужно убедиться, что никакие новые записи не были вставлены в таблицу1 во время вставки в таблицу2.

Не зная структуру вашей таблицы, трудно дать хороший ответ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top