View a markdown version of this page

Utilizzo dei vincoli di chiave esterna in Aurora DSQL - Amazon Aurora DSQL

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo dei vincoli di chiave esterna in Aurora DSQL

Con i vincoli di chiave esterna in Aurora DSQL, è possibile inserire la logica di integrità referenziale di un'applicazione nel database. Aurora SQL supporta le azioniNO ACTION, RESTRICT CASCADESET NULL, e SET DEFAULT referenziali. Supporta anche i tipi MATCH FULL e MATCH SIMPLE match e i vincoli di chiave esterna differibili. Per un'analisi completa della sintassi, vedere. Vincoli di chiave esterna

In che modo Aurora DSQL mantiene l'integrità referenziale

Aurora DSQL mantiene l'integrità referenziale in due fasi: verifica istantanea durante l'esecuzione della transazione e risoluzione dei conflitti al momento del commit. Insieme, questi passaggi garantiscono che una transazione impegnata non violi mai un vincolo di chiave esterna.

Verifica istantanea. Ogni transazione in Aurora DSQL viene eseguita su un'istantanea coerente del database scattata al momento dell'avvio. Quando si inserisce o si aggiorna una riga di riferimento, Aurora DSQL legge la tabella di riferimento nello snapshot di inizio della transazione per confermare l'esistenza della chiave di riferimento. Quando si elimina o si aggiorna una chiave di riferimento, Aurora DSQL legge la tabella di riferimento nello snapshot della transazione. Conferma che non esistono righe di riferimento (perRESTRICT) o che l'operazione non lascia righe orfane (per). NO ACTION Poiché questa verifica legge l'istantanea di inizio della transazione anziché bloccarla, altre transazioni possono continuare a modificare le tabelle di riferimento e di riferimento in parallelo.

Commit-time risoluzione. La verifica istantanea garantisce che il vincolo sia mantenuto all'ora di inizio della transazione, ma non tra start e commit. Una transazione concorrente può eliminare la riga di riferimento o inserire una riga di riferimento in conflitto dopo l'inizio della transazione. Per risolvere questi conflitti, Aurora DSQL applica implicitamente la KEY SHARE clausola alle righe di riferimento per rilevare se eventuali modifiche simultanee hanno invalidato l'istantanea. Se Aurora DSQL rileva un conflitto, fallisce la transazione con un errore di serializzazione. Per ulteriori informazioni su come la KEY SHARE clausola influisce sulle transazioni concorrenti, vedere. Controllo della concorrenza in Aurora DSQL

I controlli di integrità referenziale richiedono letture aggiuntive

Tutte le operazioni del linguaggio DML (Data Manipulation Language) su tabelle referenziate o di riferimento richiedono letture aggiuntive per garantire l'integrità referenziale. Prima di aggiungere un vincolo di chiave esterna a una tabella, effettuate un benchmark del carico di lavoro e verificate che le caratteristiche prestazionali soddisfino le vostre aspettative.

Scenari di esempio a chiave esterna

Nello scenario seguente, la orders tabella presenta un vincolo di chiave esterna sulla product_id colonna che fa riferimento alla products tabella. Ciò crea products la tabella referenziata e orders la tabella di riferimento.

CREATE TABLE products ( product_id integer PRIMARY KEY, name text, price numeric ); CREATE TABLE orders ( order_id integer PRIMARY KEY, product_id integer REFERENCES products, quantity integer ); INSERT INTO products VALUES (1, 'Widget', 9.99);

Conflitto: eliminazione e inserimento simultanei

In questo scenario, una sessione elimina una riga di riferimento mentre un'altra sessione inserisce una riga di riferimento.

-- Session A BEGIN; DELETE FROM products WHERE product_id = 1; -- Session B BEGIN; INSERT INTO orders VALUES (100, 1, 5); -- Session A COMMIT; -- succeeds -- Session B COMMIT; -- fails with serialization error ERROR: change conflicts with another transaction (OC000) (SQLSTATE 40001)

Entrambe le sessioni vengono eseguite contemporaneamente. Aurora DSQL risolve il conflitto in fase di commit. Non puoi finire con un ordine che rimanda a un prodotto eliminato.

Nessun conflitto: aggiornamento della colonna non chiave

In questo scenario, una sessione aggiorna una colonna non chiave nella riga di riferimento mentre un'altra sessione inserisce una riga di riferimento.

-- Session A BEGIN; UPDATE products SET name = 'Super Widget' WHERE product_id = 1; -- Session B BEGIN; INSERT INTO orders VALUES (101, 1, 3); -- Session A COMMIT; -- succeeds -- Session B COMMIT; -- succeeds

L'aggiornamento name (una colonna non chiave) non è in conflitto con la chiave esterna attiva. product_id La riga di riferimento si preoccupa solo che le colonne chiave della riga di riferimento rimangano le stesse.

Procedure consigliate con chiavi esterne in Aurora DSQL

Segui questi consigli quando usi i vincoli di chiave esterna in Aurora DSQL:

Implementa la logica dei tentativi

I conflitti causano errori anziché attese. Progetta il tuo carico di lavoro per riprovare le transazioni non riuscite. Per ulteriori informazioni sulla concorrenza in Aurora DSQL, vedere. Controllo della concorrenza in Aurora DSQL

Riduci al minimo l'abbandono delle colonne chiave sulle righe con riferimenti intensi

Se più righe di riferimento fanno riferimento alla stessa riga e le relative colonne chiave cambiano spesso, prendi in considerazione la possibilità di ristrutturare lo schema. Sposta i valori che cambiano frequentemente in colonne non chiave in modo che la colonna di riferimento rimanga stabile. La modifica delle colonne non chiave nella tabella di riferimento non è in conflitto con gli inserti di riferimento.