View a markdown version of this page

CREATE TABLE - 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à.

CREATE TABLE

CREATE TABLE definisce una nuova tabella.

Sintassi supportata

CREATE TABLE [ IF NOT EXISTS ] table_name ( [ { column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option ... ] } [, ... ] ] ) where column_constraint is: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | GENERATED ALWAYS AS ( generation_expr ) STORED | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters | PRIMARY KEY index_parameters | REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] and table_constraint is: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH FULL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] and referential_action in a FOREIGN KEY/REFERENCES constraint is: { NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] } and like_option is: { INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | ALL } index_parameters in UNIQUE and PRIMARY KEY constraints are: [ INCLUDE ( column_name [, ... ] ) ]

Colonne di identità

Nota

Quando si utilizzano le colonne di identità, il valore della cache deve essere considerato attentamente. Per ulteriori informazioni, consulta il callout Importante sulla CREATE SEQUENCE pagina.

Per indicazioni su come utilizzare al meglio le colonne di identità in base ai modelli di carico di lavoro, consulta. Utilizzo di sequenze e colonne di identità

La GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options ) clausola crea la colonna come colonna di identità. Sarà associata una sequenza implicita e nelle righe appena inserite la colonna conterrà automaticamente i valori della sequenza ad essa assegnata. Tale colonna è implicita. NOT NULL

Le clausole ALWAYS e BY DEFAULT determinano in che modo vengono gestiti in modo esplicito i valori e i comandi specificati dall'utente. INSERT UPDATE

In un INSERT comando, se selezionato, un valore specificato dall'utente ALWAYS viene accettato solo se l'istruzione lo specifica. INSERT OVERRIDING SYSTEM VALUE Se BY DEFAULT è selezionato, il valore specificato dall'utente ha la precedenza.

In un UPDATE comando, se ALWAYS è selezionato, qualsiasi aggiornamento della colonna a un valore diverso da quello DEFAULT verrà rifiutato. Se BY DEFAULT è selezionato, la colonna può essere aggiornata normalmente. (Non esiste una OVERRIDING clausola per il UPDATE comando.)

La sequence_options clausola può essere utilizzata per sovrascrivere i parametri della sequenza. Le opzioni disponibili includono quelle mostrate perCREATE SEQUENCE, plus. SEQUENCE NAME name SenzaSEQUENCE NAME, il sistema sceglie un nome inutilizzato per la sequenza.

Modalità di archiviazione

La STORAGE clausola opzionale imposta la modalità di archiviazione per la colonna. Utilizzate queste opzioni per controllare il comportamento della compressione per tipi di dati a lunghezza variabile comeJSON,JSONB, TEXT e. VARCHAR BPCHAR

Amazon Aurora DSQL comprime alcuni tipi di dati quando superano una determinata dimensione. Per disattivare questo comportamento, utilizza le PLAIN opzioni o. EXTERNAL

PLAIN

Aurora DSQL archivia i dati in linea senza compressione. Questa è l'unica opzione per tipi di dati a lunghezza fissa come. integer Usa questa opzione per disabilitare la compressione su alcuni tipi di lunghezza variabile.

MAIN | EXTENDED | DEFAULT

MAINe EXTENDED consenti la compressione opzionale della colonna se il tipo di dati sottostante supporta la compressione. DEFAULTimposta la modalità di archiviazione sulla modalità predefinita per il tipo di dati della colonna.

EXTERNAL

Aurora DSQL attualmente non supporta le tabelle TOAST, tuttavia EXTERNAL disabilita la compressione sui tipi di dati che supportano la compressione.

Vincoli di chiave esterna

Le FOREIGN KEY clausole REFERENCES and specificano un vincolo di chiave esterna, che richiede che un gruppo di una o più colonne della nuova tabella contenga solo valori che corrispondono ai valori nelle colonne di riferimento di una riga della tabella di riferimento. Se omettete l'refcolumnelenco, Aurora DSQL utilizza la chiave primaria di. reftable Altrimenti, l'refcolumnelenco deve fare riferimento alle colonne di un vincolo di chiave unica o primaria non differibile.

Aurora DSQL confronta un valore inserito nelle colonne di riferimento con i valori della tabella di riferimento e delle colonne referenziate utilizzando il tipo di corrispondenza specificato. Sono supportati due tipi di corrispondenza: MATCH FULL e MATCH SIMPLE (impostazione predefinita).

È possibile definire una chiave esterna come vincolo di colonna o vincolo di tabella:

  • Vincolo di colonna (RIFERIMENTI): da utilizzare REFERENCES dopo il tipo di dati della colonna per le chiavi esterne a colonna singola.

  • Vincolo di tabella (FOREIGN KEY): da utilizzare FOREIGN KEY (...) REFERENCES ... per chiavi esterne a colonna singola o a più colonne.

Azioni referenziali

Quando si modificano i dati nelle colonne di riferimento, Aurora DSQL esegue azioni sui dati nelle colonne della tabella di riferimento. La ON DELETE clausola specifica l'azione da eseguire quando una transazione elimina una riga di riferimento nella tabella di riferimento. Allo stesso modo, la ON UPDATE clausola specifica l'azione da eseguire quando una transazione aggiorna una colonna di riferimento con un nuovo valore. Se una transazione aggiorna la riga ma non modifica la colonna di riferimento, Aurora DSQL non intraprende alcuna azione.

Aurora DSQL supporta le seguenti azioni referenziali:

NO ACTION (predefinito)

Genera un errore se l'eliminazione o l'aggiornamento creassero una violazione del vincolo di chiave esterna. Se il vincolo viene posticipato, Aurora DSQL genera questo errore al momento del controllo del vincolo se esistono ancora righe di riferimento. Questa è l'impostazione predefinita.

RESTRICT

Produce un errore se una riga da eliminare o aggiornare corrisponde a una riga nella tabella di riferimento. Ciò impedisce l'azione anche se lo stato successivo all'azione non violasse il vincolo di chiave esterna. In particolare, impedisce l'aggiornamento delle righe referenziate a valori distinti ma confrontati come uguali. Al contrarioNO ACTION, il RESTRICT controllo non può essere posticipato.

Le azioni a cascata vengono conteggiate ai fini dei limiti di modifica delle transazioni

Le SET DEFAULT azioni CASCADESET NULL, e modificano automaticamente le righe della tabella di riferimento quando una riga di riferimento viene aggiornata o eliminata. Il limite di riga delle transazioni Aurora DSQL si applica a queste azioni e può causare errori imprevisti se non utilizzato con attenzione. Preferisci NO ACTION o RESTRICT per le relazioni di chiave esterna in cui la cardinalità tra righe secondarie è illimitata o imprevedibile. Per ulteriori informazioni, consulta Limiti del database in Aurora DSQL.

CASCADE

Elimina tutte le righe che fanno riferimento alla riga eliminata o aggiorna i valori delle colonne di riferimento rispettivamente con i nuovi valori delle colonne di riferimento.

SET NULL [ ( column_name [, ... ] ) ]

Imposta tutte le colonne di riferimento, o un sottoinsieme specificato delle colonne di riferimento, su null. È possibile specificare un sottoinsieme di colonne solo per le azioni. ON DELETE

SET DEFAULT [ ( column_name [, ... ] ) ]

Imposta tutte le colonne di riferimento, o un sottoinsieme specificato delle colonne di riferimento, sui valori predefiniti. È possibile specificare un sottoinsieme di colonne solo per le azioni. ON DELETE (È necessario che nella tabella di riferimento sia presente una riga corrispondente ai valori predefiniti, se non sono nulli, altrimenti l'operazione avrà esito negativo.)

Tipi di corrispondenza

Aurora DSQL supporta i seguenti tipi di corrispondenza:

MATCH SIMPLE (predefinito)

Consente a qualsiasi colonna di chiave esterna di essere nulla. Se una di esse è nulla, non è necessario che la riga abbia una corrispondenza nella tabella di riferimento.

MATCH FULL

Non consente che una colonna di una chiave esterna a più colonne sia nulla a meno che tutte le colonne di chiave esterna non siano nulle. Se sono tutte nulle, non è necessario che la riga abbia una corrispondenza nella tabella di riferimento.

È possibile applicare NOT NULL dei vincoli alle colonne di riferimento per evitare che si verifichino questi casi.

Differibilità

È possibile controllare quando un vincolo di chiave esterna viene verificato specificandone la differibilità:

NOT DEFERRABLE (predefinito)

Aurora DSQL verifica questo vincolo immediatamente dopo ogni istruzione. Non è possibile modificarlo in differito con. SET CONSTRAINTS

DEFERRABLE

Il vincolo può essere posticipato alla fine della transazione utilizzando. SET CONSTRAINTS Senza una INITIALLY clausola, il valore predefinito è. INITIALLY IMMEDIATE

DEFERRABLE INITIALLY IMMEDIATE

Per impostazione predefinita, Aurora DSQL verifica questo vincolo dopo ogni istruzione, ma è possibile differirlo all'interno di una transazione utilizzando. SET CONSTRAINTS ... DEFERRED

DEFERRABLE INITIALLY DEFERRED

Per impostazione predefinita, Aurora DSQL verifica questo vincolo al momento del commit della transazione. È possibile modificarlo in immediato all'interno di una transazione utilizzando. SET CONSTRAINTS ... IMMEDIATE

Per ulteriori informazioni sulla modifica della tempistica del controllo dei vincoli all'interno di una transazione, vedereSET CONSTRAINTS.

Solo vincoli di chiave esterna

In Aurora DSQL, l'DEFERRABLEopzione si applica solo ai vincoli di chiave esterna.

Esempi di vincoli di chiave esterna

Supponiamo di avere una tabella in cui sono memorizzati i prodotti:

CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric );

Ora vuoi una tabella che memorizzi gli ordini di quei prodotti. Vuoi assicurarti che la tabella degli ordini contenga riferimenti a prodotti effettivamente esistenti. Definisci un vincolo di chiave esterna nella tabella degli ordini che faccia riferimento alla tabella dei prodotti:

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products (product_no), quantity integer );

Ora non puoi creare ordini con product_no voci non NULL che non compaiono nella tabella dei prodotti.

In questa situazione, la tabella degli ordini è la tabella di riferimento e la tabella dei prodotti è la tabella di riferimento. Allo stesso modo, ci sono colonne referenziate e referenziate.

Puoi abbreviare il comando precedente in:

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products, quantity integer );

Se si omette l'elenco delle colonne, Aurora DSQL utilizza la chiave primaria della tabella di riferimento come colonna o colonne di riferimento.

È possibile assegnare il proprio nome a un vincolo di chiave esterna nel modo consueto:

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer CONSTRAINT fk_product REFERENCES products, quantity integer );

Una chiave esterna può anche vincolare e fare riferimento a un gruppo di colonne. Deve quindi essere scritta sotto forma di vincolo di tabella:

CREATE TABLE inventory ( warehouse_id integer, product_no integer, quantity integer, PRIMARY KEY (warehouse_id, product_no) ); CREATE TABLE shipments ( shipment_id integer PRIMARY KEY, warehouse_id integer, product_no integer, FOREIGN KEY (warehouse_id, product_no) REFERENCES inventory (warehouse_id, product_no) );

Il numero e i tipi delle colonne vincolate devono essere compatibili con il numero e i tipi delle colonne referenziate.

Una tabella può avere più di un vincolo di chiave esterna. Viene utilizzato per implementare relazioni molti-a-molti tra tabelle:

CREATE TABLE order_items ( product_no integer REFERENCES products, order_id integer REFERENCES orders, quantity integer, PRIMARY KEY (product_no, order_id) );

Un vincolo di chiave esterna può fare riferimento alla stessa tabella a cui appartiene. Questa è chiamata chiave esterna autoreferenziale. Ad esempio, se desideri che le righe di una tabella rappresentino i nodi di una struttura ad albero, puoi scrivere:

CREATE TABLE tree ( node_id integer PRIMARY KEY, parent_id integer REFERENCES tree, name text );

Un nodo di primo livello dovrebbe avere un valore NULLparent_id, mentre le parent_id voci non NULL sono vincolate a fare riferimento a righe valide della tabella.

È possibile specificare azioni referenziali per controllare cosa succede quando una riga referenziata viene eliminata o aggiornata. L'esempio seguente viene utilizzato ON DELETE RESTRICT per impedire l'eliminazione di un prodotto a cui fa ancora riferimento un ordine:

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products ON DELETE RESTRICT, quantity integer );

ConRESTRICT, il tentativo di eliminare un prodotto a cui fanno riferimento ordini produce immediatamente un errore. Con l'impostazione predefinitaNO ACTION, il controllo può essere posticipato alla fine della transazione se il vincolo viene dichiarato. DEFERRABLE

Per creare una chiave esterna che può essere posticipata alla fine di una transazione, usa l'DEFERRABLEopzione. Ciò è utile quando è necessario inserire righe in entrambe le tabelle all'interno della stessa transazione indipendentemente dall'ordine:

CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products DEFERRABLE INITIALLY DEFERRED, quantity integer );

ConDEFERRABLE INITIALLY DEFERRED, il vincolo non viene verificato fino al momento del commit. È possibile inserire la riga dell'ordine prima che esista la riga del prodotto, purché la riga del prodotto sia presente al momento del commit della transazione.

Da utilizzare MATCH FULL con una chiave esterna composita, che richiede che tutte le colonne di riferimento siano nulle insieme o tutte non nulle insieme:

CREATE TABLE shipments ( shipment_id integer PRIMARY KEY, warehouse_id integer, product_no integer, FOREIGN KEY (warehouse_id, product_no) REFERENCES inventory (warehouse_id, product_no) MATCH FULL );