Pergunta

Eu tenho tabela, que eu estou inserindo registros para outra mesa. Qual é a melhor maneira de gravar marca inserida, por isso não vai ser tentada a ser inserido novamente?

Foi útil?

Solução

Você pode ver a diferença entre as duas tabelas assim:

* SELECT FROM tableFoo
LEFT JOIN TableBar ON tableFoo.commonColumn = tableBar.commonColumn
ONDE tableBar.commonColumn IS NULL

A idéia é que ambas as tabelas têm uma coluna de igualar-se, e os registros que são unidas quando a coluna é nulo são os registros que só estão presentes em TableBar.

A razão isto funciona é porque esquerda junta irá retorna registros, mesmo se uma das mesas tem valores nulos, ao contrário de uma junção interna, o que faz o contrário.

Depois de obter esses registros, você pode inserir com base nos IDs retornados.

Outras dicas

Insira apenas não registra em sua outra mesa, quer utilizando uma cláusula NOT EXISTS ou deixado entrar e filtrar todos os registros not-NULL a partir do resultado

A melhor maneira é usar uma chave comum (ou ter a chave da primeira tabela ser a parte principal da chave segundo da tabela). Dessa forma, você simplesmente selecionar linhas da tabela 1, onde não existe na tabela 2.

A melhor alternativa, se você precisa para transformar a chave de alguma forma, é usar um disparador de inserção na tabela 1: quando você inserir linhas lá, o gatilho será acionado, e você pode inserir dados em TABLE2. Isto tem a vantagem - e também a desvantagem - de usar uma única transação. É um benefício em que você manter a consistência dos dados, uma desvantagem se TABLE2 é utilizado para outros fins não essenciais relatório ou.

NÃO decidir usar uma bandeira em TABLE1 que indica a linha foi inserida. Isso é feio tanto de um projeto lógico e físico, porque você está acoplando os dados na tabela para um processo que utiliza a tabela.

Existem dois métodos que eu uso com freqüência. Dependendo da natureza da tabela, uma forma pode ser melhor que o outro, no entanto, se você ir com # 2, existem prováveis ??oportunidades para tornar a sua estrutura de tabela melhor.

1.) Certifique-se de suas tabelas são indexadas e ter uma boa chave primária. Selecione todos os registros da tabela 1, onde a chave primária não existe no table2. Isso funciona vai para tabelas normalizadas

2). Se suas tabelas não são normalizados e não têm bom ter boas chaves, você pode adicionar um ProcessedDate para table1. Inserir todos os registros que têm um ProcessDate nulo, em seguida, definir o ProcessDate à data e hora atual. Você apenas tem que se certificar de que que há novos registros foram inseridos na tabela 1 durante o tempo que você estava inserindo table2.

Sem saber a estrutura da tabela é difícil dar uma resposta boa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top