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, puoi inserire la logica di integrità referenziale di un'applicazione nel database. Aurora DSQL supporta le azioniNO ACTION,RESTRICT, CASCADE e referenziali. SET NULL SET DEFAULT Supporta anche i tipi MATCH FULL e MATCH SIMPLE match e i vincoli di chiave esterna differibili. Per la suddivisione 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 delle istantanee durante l'esecuzione della transazione e risoluzione dei conflitti in fase di 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 all'ora di inizio. Quando si inserisce o si aggiorna una riga di riferimento, Aurora DSQL legge la tabella di riferimento nell'istantanea 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 nell'istantanea della transazione. Conferma che non esistono righe di riferimento (forRESTRICT) o che l'operazione non lascia righe orfane (for). NO ACTION Poiché questa verifica si basa sull'istantanea di inizio della transazione anziché richiedere un blocco, le altre transazioni possono continuare a modificare le tabelle di riferimento e di riferimento in parallelo.

Commit-time risoluzione. La verifica istantanea garantisce il mantenimento del vincolo all'ora di inizio della transazione, ma non tra l'avvio e il 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 una modifica concomitante ha invalidato l'istantanea. Se Aurora DSQL rileva un conflitto, la transazione fallisce con un errore di serializzazione. Per ulteriori informazioni su come la KEY SHARE clausola influisce sulle transazioni simultanee, vedere. Controllo della concorrenza in Aurora DSQL

I controlli di integrità referenziale comportano letture aggiuntive

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

Scenari di esempio

Nello scenario seguente, nella product_id colonna della orders tabella è presente un vincolo di chiave esterna che fa riferimento alla tabella. products Questo crea products la tabella di riferimento 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 al momento del commit. Non puoi finire con un ordine che rimanda a un prodotto eliminato.

Nessun conflitto: aggiornamento delle colonne 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 attivata. product_id Alla riga di riferimento interessa solo che le colonne chiave della riga di riferimento rimangano invariate.

Procedure consigliate con le chiavi esterne in Aurora DSQL

Implementa la logica dei tentativi

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

Riduci al minimo l'abbandono delle colonne chiave nelle righe con molti riferimenti

Se più righe di riferimento fanno riferimento alla stessa riga e le relative colonne chiave cambiano spesso, valuta 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.