SERIAL data type
Informix®
SERIAL,
BIGSERIAL data types to produce automatic integer sequences:SERIALcan produce 32 bit integers (INTEGER)BIGSERIALcan produced 64 bit integers (BIGINT)SERIAL8is a synonym forBIGSERIAL
- Create the table with a column using
SERIAL, orBIGSERIAL. - To generate a new serial, no value or a zero value is specified in the
INSERTstatement:INSERT INTO tab1 ( c ) VALUES ( 'aa' ) INSERT INTO tab1 ( k, c ) VALUES ( 0, 'aa' ) - After
INSERT, the new value of aSERIALcolumn is provided inSQLCA.SQLERRD[2], while the new value of aBIGSERIALvalue must be fetched with aSELECT dbinfo('bigserial')query.
Informix allows you to insert rows with a value
different from zero for a serial column. Using an explicit value will automatically increment the
internal serial counter, to avoid conflicts with future INSERT statements that are
using a zero value:
CREATE TABLE tab ( k SERIAL); -- internal counter = 0
INSERT INTO tab VALUES ( 0 ); -- internal counter = 1
INSERT INTO tab VALUES ( 10 ); -- internal counter = 10
INSERT INTO tab VALUES ( 0 ); -- internal counter = 11
DELETE FROM tab; -- internal counter = 11
INSERT INTO tab VALUES ( 0 ); -- internal counter = 12
Oracle® MySQL and MariaDB
MySQL supports the AUTO_INCREMENT column definition option as well as the
SERIAL keyword:
-
In
CREATE TABLE, you specify a auto-incremented column with theAUTO_INCREMENTattribute -
Auto-incremented columns have the same behavior as Informix
SERIALcolumns -
A start value can be defined with
ALTER TABLE tabname AUTO_INCREMENT = value -
The column must be the primary key, or the first column of an index.
-
When using the InnoDB engine, with MySQL 5.7 and earlier, auto-incremented columns might reuse unused sequences after a server restart. For example, if you insert rows that generate the numbers 101, 102 and 103, then you delete rows 102 and 103; When the server is restarted, next generated number will be 101 + 1 = 102. Starting with MySQL 8.0, the last auto-incremented value is written to the disk and persists across server restarts.
-
SERIALis a synonym forBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
Solution
The Informix SERIAL data type is
emulated with MySQL AUTO_INCREMENT option.
dbi.database.dbname.ifxemul.datatype.serial = {true|false}
dbi.database.dbname.ifxemul.datatype.serial8 = {true|false}
dbi.database.dbname.ifxemul.datatype.bigserial = {true|false}After an insert, SQLCA.SQLERRD[2] holds the last generated serial value.
However, SQLCA.SQLERRD[2] is defined as an INTEGER, it cannot hold
values from BIGINT auto incremented columns. If you are using
BIGINT auto incremented columns, you must use the LAST_INSERT_ID()
SQL function.
AUTO_INCREMENT columns must be primary keys. This is handled automatically
when you create a table in a BDL program.
Like Informix, MySQL allows you to specify a zero
for auto-incremented columns. However, for SQL portability, it is recommended to review
INSERT statements to remove the SERIAL column from the list.
INSERT INTO tab (col1,col2) VALUES ( 0, p_value)INSERT INTO tab (col2) VALUES (p_value)Static SQL INSERT using records defined from the schema file must also be
reviewed:
DEFINE rec LIKE tab.*
INSERT INTO tab VALUES ( rec.* ) -- will use the serial column can be converted to:
INSERT INTO tab VALUES rec.* -- without parentheses, serial column is removed