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 SEQUENCE
CREATE SEQUENCE— definire un nuovo generatore di sequenze.
Importante
In PostgreSQL, la CACHE specificazione è facoltativa e il valore predefinito è 1. In un sistema distribuito come Amazon Aurora DSQL, le operazioni di sequenza implicano il coordinamento e una dimensione della cache pari a 1 può aumentare il sovraccarico di coordinamento in caso di elevata concorrenza. Sebbene valori di cache più elevati consentano di fornire numeri di sequenza da intervalli preallocati localmente, migliorando la velocità di trasmissione, è possibile perdere i valori riservati non utilizzati, rendendo più visibili le lacune e gli effetti di ordinamento. Poiché le applicazioni differiscono nella loro sensibilità all'ordinamento delle allocazioni rispetto alla velocità effettiva, Amazon Aurora DSQL richiede di essere specificato in modo esplicito e attualmente supporta CACHE = 1 o CACHE >= 65536 fornisce una chiara distinzione tra un comportamento di allocazione più vicino CACHE alla generazione strettamente sequenziale e l'allocazione ottimizzata per carichi di lavoro altamente simultanei.
QuandoCACHE >= 65536, è garantito che i valori della sequenza siano unici, ma potrebbero non essere generati in ordine crescente tra le sessioni, e possono verificarsi lacune, in particolare quando i valori memorizzati nella cache non vengono consumati completamente. Queste caratteristiche sono coerenti con la semantica di PostgreSQL per le sequenze memorizzate nella cache in uso simultaneo, in cui entrambi i sistemi garantiscono valori distinti ma non garantiscono un ordinamento strettamente sequenziale tra le sessioni.
All'interno di una singola sessione client, i valori di sequenza potrebbero non apparire sempre strettamente crescenti, in particolare al di fuori delle transazioni esplicite. Questo comportamento è simile alle distribuzioni PostgreSQL che utilizzano il pool di connessioni. Un comportamento di allocazione più simile a un ambiente PostgreSQL a sessione singola può essere ottenuto utilizzando CACHE = 1 o ottenendo valori di sequenza all'interno di transazioni esplicite.
ConCACHE = 1, l'allocazione delle sequenze segue il comportamento delle sequenze non memorizzate nella cache di PostgreSQL.
Per indicazioni su come utilizzare al meglio le sequenze basate sui modelli di carico di lavoro, consulta. Utilizzo di sequenze e colonne di identità
Sintassi supportata
CREATE SEQUENCE [ IF NOT EXISTS ] name CACHE cache [ AS data_type ] [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ [ NO ] CYCLE ] [ START [ WITH ] start ] [ OWNED BY { table_name.column_name | NONE } ] where data_type is BIGINT and cache = 1 or cache >= 65536
Description
CREATE SEQUENCEcrea un nuovo generatore di numeri di sequenza. Ciò comporta la creazione e l'inizializzazione di una nuova tabella speciale a riga singola con il nome. name Il generatore sarà di proprietà dell'utente che emette il comando.
Se viene fornito un nome di schema, la sequenza viene creata nello schema specificato. Altrimenti viene creata nello schema corrente. Il nome della sequenza deve essere distinto dal nome di qualsiasi altra relazione (tabella, sequenza, indice, vista, vista materializzata o tabella esterna) nello stesso schema.
Dopo aver creato una sequenza, è possibile utilizzare le funzioni nextval e setval operare sulla sequenza. currval Queste funzioni sono documentate inFunzioni di manipolazione di sequenze.
Sebbene non sia possibile aggiornare direttamente una sequenza, è possibile utilizzare una query come:
SELECT * FROM name;
per esaminare alcuni parametri e lo stato corrente di una sequenza. In particolare, il last_value campo della sequenza mostra l'ultimo valore assegnato da ogni sessione. (Naturalmente, questo valore potrebbe essere obsoleto nel momento in cui viene stampato, se altre sessioni effettuano nextval chiamate attivamente.) Altri parametri come increment e maxvalue possono essere osservati nella pg_sequences vista.
Parameters
IF NOT EXISTS-
Non generare un errore se esiste già una relazione con lo stesso nome. In questo caso viene emesso un avviso. Nota che non c'è alcuna garanzia che la relazione esistente sia qualcosa di simile alla sequenza che sarebbe stata creata: potrebbe anche non essere una sequenza.
name-
Il nome (facoltativamente qualificato dallo schema) della sequenza da creare.
data_type-
La clausola facoltativa
ASspecifica il tipo di dati della sequenza. I tipi validi sono.data_typebigintbigintè l'impostazione predefinita. Il tipo di dati determina i valori minimo e massimo predefiniti della sequenza. increment-
La clausola facoltativa
INCREMENT BYspecifica quale valore viene aggiunto al valore della sequenza corrente per creare un nuovo valore. Un valore positivo creerà una sequenza crescente, uno negativo una sequenza discendente. Il valore predefinito è 1.increment minvalue/NO MINVALUE-
La clausola opzionale
MINVALUEdetermina il valore minimo che una sequenza può generare. Se questa clausola non viene fornita ominvalueNO MINVALUEviene specificata, verranno utilizzate le impostazioni predefinite. L'impostazione predefinita per una sequenza crescente è 1. L'impostazione predefinita per una sequenza decrescente è il valore minimo del tipo di dati. maxvalue/NO MAXVALUE-
La clausola opzionale
MAXVALUEdetermina il valore massimo per la sequenza. Se questa clausola non viene fornita omaxvalueNO MAXVALUEviene specificata, verranno utilizzati i valori predefiniti. L'impostazione predefinita per una sequenza crescente è il valore massimo del tipo di dati. L'impostazione predefinita per una sequenza decrescente è -1. CYCLE/NO CYCLE-
L'
CYCLEopzione consente alla sequenza di avvolgersi quando lamaxvalueominvalueè stata raggiunta rispettivamente da una sequenza ascendente o discendente. Se viene raggiunto il limite, il numero successivo generato sarà rispettivamente ilminvalueomaxvalue.Se
NO CYCLEè specificato, tutte le chiamate effettuatenextvaldopo che la sequenza ha raggiunto il valore massimo restituiranno un errore. Se non viene specificato nessuno dei dueCYCLE,NO CYCLEè l'impostazione predefinita.NO CYCLE start-
La clausola opzionale
START WITHconsente alla sequenza di iniziare da qualsiasi punto. Il valore iniziale predefinito èstartminvalueper le sequenze ascendenti emaxvalueper quelle discendenti. cache-
La clausola
CACHEspecifica quanti numeri di sequenza devono essere preallocati e archiviati in memoria per un accesso più rapido. I valori accettabili percacheCACHEAurora DSQL sono 1 o qualsiasi numero >= 65536. Il valore minimo è 1 (è possibile generare solo un valore alla volta, il che significa nessuna cache). OWNED BY/table_name.column_nameOWNED BY NONE-
L'
OWNED BYopzione fa sì che la sequenza venga associata a una colonna specifica della tabella, in modo che se quella colonna (o l'intera tabella) viene eliminata, anche la sequenza verrà eliminata automaticamente. La tabella specificata deve avere lo stesso proprietario e appartenere allo stesso schema della sequenza.OWNED BY NONE, l'impostazione predefinita, specifica che tale associazione non esiste.
Note
Utilizzare DROP SEQUENCE per rimuovere una sequenza.
Le sequenze sono basate sull'bigintaritmetica, quindi l'intervallo non può superare l'intervallo di un numero intero di otto byte (da -9223372036854775808 a 9223372036854775807).
Poiché le chiamate e non vengono mai annullate, gli oggetti di sequenza non possono essere utilizzati se è necessaria l'assegnazione «senza interruzioni» dei numeri di sequenza. nextval setval
Ogni sessione allocherà e memorizzerà nella cache i valori di sequenza successivi durante un accesso all'oggetto sequenza e aumenterà di conseguenza quelli dell'oggetto sequenza. last_value Quindi, i successivi utilizzi cache -1 di nextval quella sessione restituiscono semplicemente i valori preallocati senza toccare l'oggetto della sequenza. Pertanto, tutti i numeri assegnati ma non utilizzati all'interno di una sessione andranno persi al termine di quella sessione, con conseguenti «buchi» nella sequenza.
Inoltre, sebbene sia garantito che più sessioni assegnino valori di sequenza distinti, i valori potrebbero essere generati in modo non sequenziale se si considerano tutte le sessioni. Ad esempio, con un'cacheimpostazione di 10, la sessione A potrebbe riservare i valori 1.. 10 e restituire nextval =1, quindi la sessione B potrebbe riservare i valori 11.. 20 e restituire nextval =11 prima che la sessione A abbia generato =2. nextval Pertanto, con un'cacheimpostazione pari a uno si può presumere che nextval i valori vengano generati in sequenza; con un'cacheimpostazione maggiore di uno si deve solo supporre che nextval i valori siano tutti distinti, non che vengano generati in modo puramente sequenziale. Inoltre, last_value rifletterà il valore più recente riservato da qualsiasi sessione, indipendentemente dal fatto che sia stato ancora restituito da. nextval
Un'altra considerazione è che un'setvalesecuzione su tale sequenza non verrà notata dalle altre sessioni finché non avranno esaurito i valori preallocati che hanno memorizzato nella cache.
Esempi
Create una sequenza crescente chiamataserial, a partire da 101:
CREATE SEQUENCE serial CACHE 65536 START 101;
Seleziona il numero successivo da questa sequenza:
SELECT nextval('serial'); nextval --------- 101
Seleziona il numero successivo da questa sequenza:
SELECT nextval('serial'); nextval --------- 102
Usa questa sequenza in un INSERT comando:
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
Reimposta la sequenza su un valore specifico utilizzandosetval:
SELECT setval('serial', 200); SELECT nextval('serial'); nextval --------- 201
Compatibilità
CREATE SEQUENCEè conforme allo standard SQL, con le seguenti eccezioni:
-
L'ottenimento del valore successivo viene eseguito utilizzando la
nextval()funzione anziché l'espressione delloNEXT VALUE FORstandard. -
La
OWNED BYclausola è un'estensione PostgreSQL.