Domanda

Ho una tabella, che sto inserendo i record in un'altra tabella. Qual è il modo migliore per contrassegnare il record inserito, quindi non si tenterà di inserirlo di nuovo?

È stato utile?

Soluzione

Puoi vedere la differenza tra le due tabelle in questo modo:

  

SELEZIONA * DA tableFoo
    LEFT JOIN tableBar ON tableFoo.commonColumn = tableBar.commonColumn
    DOVE tableBar.commonColumn IS NULL

L'idea è che entrambe le tabelle hanno una colonna su cui abbinare, e i record che vengono uniti quando la colonna è nulla sono i record presenti solo in tableBar.

Il motivo per cui funziona è che i join di sinistra restituiranno record anche se una delle tabelle ha valori null, a differenza di un join interno, che fa il contrario.

Dopo aver ottenuto quei record, è possibile inserire in base agli ID restituiti.

Altri suggerimenti

inserisci solo i record non presenti nell'altra tabella, utilizzando una clausola NOT EXISTS o unendo e filtrando a sinistra tutti i record non-NULL dal risultato

Il modo migliore è usare una chiave comune (o fare in modo che la chiave della prima tabella sia la parte iniziale della chiave della seconda tabella). In questo modo, è sufficiente selezionare le righe da TABELLA1 dove NON ESISTE nella tabella 2.

La migliore alternativa, se è necessario trasformare la chiave in qualche modo, è utilizzare un trigger di inserimento su TABELLA1: quando si inseriscono righe lì, il grilletto si attiva e si possono inserire dati in TABELLA2. Ciò ha il vantaggio - e anche lo svantaggio - di utilizzare un'unica transazione. È un vantaggio in quanto si mantiene la coerenza dei dati, uno svantaggio se TABLE2 viene utilizzato per la creazione di report o altri scopi non essenziali.

NON decidere di utilizzare un flag in TABELLA 1 che indica che la riga è stata inserita. Questo è brutto sia dal punto di vista logico che fisico, perché stai accoppiando i dati nella tabella a un processo che utilizza la tabella.

Esistono due metodi che utilizzo frequentemente. A seconda della natura del tavolo, un modo può essere migliore di un altro, tuttavia se vai con il n. 2, ci sono probabilmente opportunità per migliorare la struttura del tuo tavolo.

1.) Assicurati che le tue tabelle siano indicizzate e abbiano una buona chiave primaria. Selezionare tutti i record dalla tabella 1 in cui la chiave primaria non esiste nella tabella2. Funziona con tabelle normalizzate

2.) Se le tabelle non sono normalizzate e non hanno buone chiavi, è possibile aggiungere una ProcessedDate alla tabella1. Inserire tutti i record che hanno un ProcessDate null quindi impostare ProcessDate sul datetime corrente. Dovrai solo assicurarti che nessun nuovo record sia stato inserito nella tabella1 durante il periodo in cui lo hai inserito nella tabella2.

Senza conoscere la struttura della tabella è difficile dare una buona risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top