Oracle and PostgreSQL sequences
With Amazon DMS, you can manage database sequence objects across heterogeneous database platforms during migration. Sequences are unique identifiers that generate sequential numbers, often used as primary keys in tables.
| Feature compatibility | Amazon SCT / Amazon DMS automation level | Amazon SCT action code index | Key differences |
|---|---|---|---|
|
|
|
Different syntax for a few options in PostgreSQL |
Oracle usage
Sequences are database objects that serve as unique identity value generators, for example, automatically generating primary key values. Oracle treats sequences as independent objects. The same sequence can generate values for multiple tables.
Sequences can be configured with multiple parameters to control their value-generating behavior. For example, the INCREMENT BY sequence parameter defines the interval between each generated sequence value. If more than one database user is generating incremented values from the same sequence, each user may encounter gaps in the generated values that are visible to them.
Oracle 18c introduces scalable sequences: a special class of sequences that are optimized for multiple concurrent session usage.
This introduces the following new options when creating a new sequence:
-
SCALE— enable the sequence scalability feature.-
EXTEND— extend in additional 6 digits offset (as default) and the maximum number of digits in the sequence (maxvalue/minvalue). -
NOEXTEND(default when using theSCALEoption) — sequence value will be padded to the max value.
-
-
NOSCALE— non-scalable sequence usage.
Oracle sequence options
By default, the initial and increment values for a sequence are both 1, with no upper limit.
-
INCREMENT BY: Controls the sequence interval value of the increment or decrement (if a negative value is specified). If the INCREMENT BY parameter isn’t specified during sequence creation, the value is set to 1. The increment can’t be assigned a value of 0. -
START WITH: Defines the initial value of a sequence. The default value is 1. -
MAXVALUE|NOMAXVALUE: Specifies the maximum limit for values generated by a sequence. It must be equal or greater than the START WITH parameter and must be greater in value than theMINVALUEparameter. The default forNOMAXVALUEis 1027 for an ascending sequence. -
MINVALUE|NOMINVALUE: Specifies the minimum limit for values generated by a sequence. Must be less than or equal to theSTART WITHparameter and must be less than theMAXVALUEparameter. The default forNOMINVALUEis -1026 for a descending sequence. -
CYCLE|NOCYCLE: Instructs a sequence to continue generating values despite reaching the maximum value or the minimum value. If the sequence reaches one of the defined ascending limits, it generates a new value according to the minimum value. If it reaches a descending limit, it generates a new value according to the maximum value.NOCYCLEis the default. -
CACHE|NOCACHE: Specifies the number of sequence values to keep cached in memory for improved performance.CACHEhas a minimum value of 2. TheNOCACHEparameter causes a sequence to not cache values in memory. Specifying neitherCACHEnorNOCACHEwill cache 20 values to memory. In the event of a database failure, all unused cached sequence values are lost and gaps in sequence values may occur. -
SCALE|NOSCALE: Enable the scalable sequences feature (described above).
Examples
Create a sequence.
CREATE SEQUENCE SEQ_EMP START WITH 100 INCREMENT BY 1 MAXVALUE 99999999999 CACHE 20 NOCYCLE;
Drop a sequence.
DROP SEQUENCE SEQ_EMP;
View sequences created for the current schema or user.
SELECT * FROM USER_SEQUENCES;
Use a sequence as part of an INSERT INTO statement.
CREATE TABLE EMP_SEQ_TST (COL1 NUMBER PRIMARY KEY, COL2 VARCHAR2(30)); INSERT INTO EMP_SEQ_TST VALUES(SEQ_EMP.NEXTVAL, 'A'); COL1 COL2 100 A
Query the current value of a sequence.
SELECT SEQ_EMP.CURRVAL FROM DUAL;
Manually increment the value of a sequence according to the INCREMENT BY specification.
SELECT SEQ_EMP.NEXTVAL FROM DUAL;
Alter an existing sequence.
ALTER SEQUENCE SEQ_EMP MAXVALUE 1000000;
Create a scalable sequence.
CREATE SEQUENCE scale_seq MINVALUE 1 MAXVALUE 9999999999 SCALE; select scale_seq.nextval as scale_seq from dual; NEXTVAL 1010320001
Oracle 12c default values using sequences
Starting with Oracle 12c, you can assign a sequence to a table column with the CREATE TABLE statement and specify the NEXTVAL configuration of the sequence.
Generate DEFAULT values using sequences.
CREATE TABLE SEQ_TST ( COL1 NUMBER DEFAULT SEQ_1.NEXTVAL PRIMARY KEY, COL2 VARCHAR(30));
INSERT INTO SEQ_TST(COL2) VALUES('A');
SELECT * FROM SEQ_TST;
COL1 COL2
100 A
Oracle 12c session sequences (SESSION or GLOBAL)
Beginning with Oracle 12c, sequences can be created as session-level or global-level. By adding the SESSION parameter to a CREATE SEQUENCE statement, the sequence is created as a session-level sequence. Optionally, you can use the GLOBAL keyword to create a global sequence to provide consistent results across sessions in the database. Global sequences are the default. Session sequences return a unique range of sequence numbers only within a session.
Create Oracle 12c SESSION and GLOBAL sequences.
CREATE SEQUENCE SESSION_SEQ SESSION; CREATE SEQUENCE SESSION_SEQ GLOBAL;
Oracle 12c identity columns
You can use sequences as an IDENTITY type, which automatically creates a sequence and associates it with the table column. The main difference is that there is no need to create a sequence manually; the IDENTITY type does that for you. An IDENTITY type is a sequence that can be configured.
Insert records using an Oracle 12c IDENTITY column (explicitly or implicitly).
INSERT INTO IDENTITY_TST(COL2) VALUES('A');
INSERT INTO IDENTITY_TST(COL1, COL2) VALUES(DEFAULT, 'B');
INSERT INTO IDENTITY_TST(col1, col2) VALUES(NULL, 'C');
SELECT * FROM IDENTITY_TST;
COL1 COL2
120 A
130 B
For more information, see CREATE SEQUENCE
PostgreSQL usage
Sequences in PostgreSQL serve the same purpose as in Oracle; they generate numeric identifiers automatically. The PostgreSQL CREATE SEQUENCE command is mostly compatible with the Oracle CREATE SEQUENCE command. A sequence object is owned by the user that created it.
Oracle 18c introduces scalable sequences, this feature isn’t always needed but if it and the current PostgreSQL isn’t scalable enough, you can use other solutions and services to allow high-concurrency data read (to store only sequences data), this option will require more changes in the application layer.
PostgreSQL sequence synopsis
CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name
[ AS data_type ]
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
[ OWNED BY { table_name.column_name | NONE } ]
Most PostgreSQL CREATE SEQUENCE parameters are compatible with Oracle. Similar to Oracle 12c, in PostgreSQL you can create a sequence and use it directly as part of a CREATE TABLE statement.
Sequence parameters
-
TEMPORARYorTEMP— PostgreSQL can create a temporary sequence within a session. Once the session ends, the sequence is automatically dropped. -
IF NOT EXISTS— Creates a sequence even if a sequence with an identical name already exists. Replaces the existing sequence. -
AS— A new option in PostgreSQL 10. It is for specifying the data type of the sequence. The available options aresmallint,integer, andbigint(default). This also determines the maximum and minimum values. -
INCREMENT BY— An optional parameter with a default value of 1. Positive values generate sequence values in ascending order. Negative values generate sequence values in descending sequence. -
START WITH— The same as Oracle. This is an optional parameter having a default of 1. It uses theMINVALUEfor ascending sequences and the MAXVALUE for descending sequences. -
MAXVALUE|NO MAXVALUE— Defaults are between 263 for ascending sequences and -1 for descending sequences. -
MINVALUE|NO MINVALUE— Defaults are between 1 for ascending sequences and -263 for descending sequences. -
CYCLE|NO CYCLE— If the sequence value reachesMAXVALUEorMINVALUE, theCYCLEparameter instructs the sequence to return to the initial value (MINVALUEorMAXVALUE). The default isNO CYCLE. -
CACHE — Note that in PostgreSQL, the
NOCACHEisn’t supported. By default, when not specifying theCACHEparameter, no sequence values will be pre-cached into memory, which is equivalent to the OracleNOCACHEparameter. The minimum value is 1. -
OWNED BY|OWNBY NON— Specifies that the sequence object is to be associated with a specific column in a table, which isn’t supported by Oracle. When dropping this type of sequence, an error will be returned because of the sequence/table association.
Examples
Create a sequence.
CREATE SEQUENCE SEQ_1 START WITH 100 INCREMENT BY 1 MAXVALUE 99999999999 CACHE 20 NO CYCLE;
Identical to Oracle syntax, except for the whitespace in the NO CYCLE parameter.
Drop a sequence.
DROP SEQUENCE SEQ_1;
View sequences created in the current schema and sequence specifications.
SELECT * FROM INFORMATION_SCHEMA.SEQUENCES; OR \ds
Use a PostgreSQL sequence as part of a CREATE TABLE and an INSERT statement.
CREATE TABLE SEQ_TST (COL1 NUMERIC DEFAULT NEXTVAL('SEQ_1') PRIMARY KEY, COL2 VARCHAR(30));
INSERT INTO SEQ_TST (COL2) VALUES('A');
SELECT * FROM SEQ_TST;
col1 col2
100 A
Use the OWNED BY parameter to associate the sequence with a table.
CREATE SEQUENCE SEQ_1 START WITH 100 INCREMENT BY 1 OWNED BY SEQ_TST.COL1;
Query the current value of a sequence.
SELECT CURRVAL('SEQ_1);
Manually increment a sequence value according to the INCREMENT BY value.
SELECT NEXTVAL('SEQ_1');
OR
SELECT SETVAL('SEQ_1', 200);
Alter an existing sequence.
ALTER SEQUENCE SEQ_1 MAXVALUE 1000000;
Note
To use the NEXTVAL function, the USAGE and UPDATE permissions on the sequence are needed. To use CURRVAL and LASTVAL functions, the USAGE and SELECT permissions on the sequence are needed.
Generating Sequence by SERIAL Type
PostgreSQL enables you to create a sequence that is similar to the AUTO_INCREMENT property supported by identity columns in Oracle 12c. When creating a new table, the sequence is created through the SERIAL data type. Other types from the same family are SMALLSERIAL and BIGSERIAL.
By assigning a SERIAL type to a column on table creation, PostgreSQL creates a sequence using the default configuration and adds a NOT NULL constraint to the column. The newly created sequence behaves like a regular sequence.
Examples
Using a SERIAL Sequence.
CREATE TABLE SERIAL_SEQ_TST(COL1 SERIAL PRIMARY KEY, COL2 VARCHAR(10));
INSERT INTO SERIAL_SEQ_TST(COL2) VALUES('A');
SELECT * FROM SERIAL_SEQ_TST;
col1 col2
1 A
\ds
Schema Name Type Owner
public serial_seq_tst_col1_seq sequence pg_tst_db
Summary
| Parameter or feature | Compatibility with PostgreSQL | Comments |
|---|---|---|
|
Create sequence syntax |
Full, with minor differences |
See Exceptions |
|
|
Full |
|
|
|
Full |
|
|
|
Full |
Use |
|
|
Full |
Use |
|
|
Full |
Use |
|
|
PostgreSQL doesn’t support the |
|
|
Default values using sequences in Oracle 12c |
Supported by PostgreSQL |
|
|
Session sequences (session or global) in Oracle 12c |
Supported by PostgreSQL by using the |
|
|
Oracle 12c identity columns |
Supported by PostgreSQL by using the |
For more information, see CREATE SEQUENCE