Отметить вставленную запись - PullRequest
0 голосов
/ 22 октября 2009

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

Ответы [ 4 ]

2 голосов
/ 22 октября 2009

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

SELECT * FROM tableFoo
ВЛЕВО СОЕДИНЯЕТ tableBar ON tableFoo.commonColumn = tableBar.commonColumn
ГДЕ tableBar.commonColumn is NULL

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

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

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

1 голос
/ 22 октября 2009

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

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

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

1 голос
/ 22 октября 2009

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

слева
0 голосов
/ 22 октября 2009

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

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

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

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

...