AutoNumber and Identity columns
Most databases support autonumber or identity columns. While Oracle doesn't directly support this feature, it can be simulated in Oracle.
Other databases[edit]
For example, Microsoft SQL Server developers can create "Identity" primary key columns and MS Access users can create "AutoNumber" columns. Here is an MS-SQL example:
CREATE TABLE tab1 ( id INT IDENTITY(1,1) PRIMARY KEY );
Similarly, MySQL offers AUTO_INCREMENT columns and PostgreSQL supports SERIAL and BIGSERIAL column types.
Oracle solution[edit]
While Oracle supports sequences for generating primary key values, SEQUENCES are not tied to a particular column in a table. To get the same effect in Oracle, one can create a TRIGGER to automatically assign sequence values to a column. At first, this sounds cumbersome. However, it is as effective, and a good deal more flexible too.
Look at this example:
rem Create a table and a sequence for generating key values:
SQL> CREATE TABLE tab1 (
2 id NUMBER PRIMARY KEY,
3 val VARCHAR2(30)
4 );
Table created.
SQL>
SQL> CREATE SEQUENCE tab1_id_seq;
Sequence created.
SQL>
SQL> INSERT INTO tab1(id, val) VALUES (tab1_id_seq.nextval, 'row1');
1 row created.
SQL>
SQL> SELECT * FROM tab1;
ID VAL
---------- ------------------------------
1 row1
Now, let's automate this using a trigger to simulate AutoNumber/Identity functionality:
SQL> CREATE OR REPLACE TRIGGER tab1_trg
2 BEFORE INSERT ON tab1
3 FOR EACH ROW
4 BEGIN
5 SELECT tab1_id_seq.nextval INTO :new.id FROM dual;
6 END;
7 /
Trigger created.
SQL> SHOW ERRORS
No errors.
SQL>
SQL> INSERT INTO tab1(val) VALUES ('row2');
1 row created.
SQL> INSERT INTO tab1(id, val) VALUES (null, 'row3');
1 row created.
SQL> SELECT * FROM tab1;
ID VAL
---------- ------------------------------
1 row1
2 row2
3 row3
