In SQL, il concetto di chiavi esterne è un importante che può essere trovato in tutti i database professionali utilizzati nel settore. L’idea principale è impedire al database PostgreSQL di memorizzare dati incoerenti applicando i vincoli che garantiscono la correttezza delle tabelle (almeno per quanto riguarda le relazioni tra gli oggetti). L’integrità referenziale è quindi uno dei concetti più importanti mai inventati in ESSO.

Tuttavia, le chiavi esterne introdurranno alcuni problemi di cui devi occuparti durante la scrittura di applicazioni. Se non ci sono chiavi esterne, è possibile inserire i dati in qualsiasi tabella in qualsiasi ordine. PostgreSQL non si preoccupa. Tuttavia, se è presente una chiave esterna, l’ordine inizia a essere importante (almeno in uno scenario tipico, ma ne riparleremo più avanti).

Chiavi esterne e ordine

Per mostrare l’importanza dell’ordine, dobbiamo prima creare un modello di dati:

Vogliamo memorizzare valute, prodotti e descrizioni dei prodotti. Fondamentalmente è un modello di dati molto semplice. Vediamo se ci capita di inserire nella tabella dei prodotti:

Logicamente il primo INSERTO fallirà perché la valuta numero 1 non esiste ancora. Se vogliamo INSERIRE, dobbiamo usare un valore NULL (=valuta sconosciuta). In parole d’ordine: dobbiamo prima riempire la tabella delle valute, quindi inserire le posizioni e così via. L’ordine ha importanza nel caso predefinito.

Determinare l’ordine di inserimento corretto per le chiavi esterne

Se devi iniziare a utilizzare un modello di dati esistente, può essere un po ‘ difficile aggirare questa roba. Compilare un modello di dati vuoto può essere un po ‘ complicato. Quindi perché non scrivere una query che ci dice l’ordine in cui dovremmo inserire i dati?

Bene, ecco che magic query

La query non è banale da leggere, ma ho fatto del mio meglio per documentarla un po’. Fondamentalmente, le tabelle di sistema PostgreSQL hanno tutte le informazioni necessarie per determinare l’ordine corretto. Ecco l’output:

 table_name | level-----------------+------- t_currency | 1 t_location | 1 t_product | 2 t_product_desc | 3 t_product_stock | 3(5 rows)

Come puoi vedere, la query ci ha dato correttamente le tabelle nell’ordine desiderato. In primo luogo, dobbiamo inserire in tutte le tabelle al livello uno e così via. Se ci atteniamo a questo ordine, l’integrità referenziale sarà sempre garantita (supponendo che i dati siano corretti).

Facendo uso di vincoli “inizialmente differiti”

In alcuni casi, l’ordine di inserimento può essere una brutta cosa da affrontare. E se avessimo i mezzi per dire a PostgreSQL di ignorare l’ordine e verificare invece l’integrità sul commit? Questo è esattamente ciò che fa “inizialmente differito”. Ecco come funziona:

In questo caso, possiamo modificare i dati in qualsiasi ordine vogliamo. Finché l’integrità è garantita per essere intatta alla fine della transazione, PostgreSQL va perfettamente bene. PostgreSQL posticiperà il controllo dei vincoli e toglierà un po ‘ di peso allo sviluppatore.

Infine Finally

Se vuoi saperne di più su advanced SQL, potresti dare un’occhiata al mio blog su alcune funzioni di finestra più avanzate (con legami). Quindi indossa la cravatta e leggi per saperne di più.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.