In Oracle sequences are often used to maintain a unique series of numbers for an ID field. Sequences are independant of any table and can be used to keep a value unique across a number of tables. In fact they are not even restricted to use in tables.
A D V E R T I S E M E N T
MySQL doesn't currently support sequences. However it does have an auto increment value which can be applied to a primary key of a table. This is done during the table creation.
As the name suggests the value is assigned automatically, this is in contrast to Oracle where we have to call the nextval function of the sequence to return the value when we need it.
So if we perform an insert against the table but do not specifiy a value for the auto_increment column it's assigned automatically.
mysql> create table seq_test (id int primary key auto_increment ,name varchar(30));Query OK, 0 rows affected (0.06 sec)
Using AUTO_INCREMENT column:
The simplest way in MySQL to use Sequences is to define a column as
AUTO_INCREMENT and leave rest of the things to MySQL to take care.
Example:
Try out following example. This will create table and after that it will
insert few rows in this table where it is not required to give record ID because
its auto incremented by MySQL.
mysql> CREATE TABLE insect
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL, # type of insect
-> date DATE NOT NULL, # date collected
-> origin VARCHAR(30) NOT NULL # where collected
);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO insect (id,name,date,origin) VALUES
-> (NULL,'housefly','2001-09-10','kitchen'),
-> (NULL,'millipede','2001-09-10','driveway'),
-> (NULL,'grasshopper','2001-09-10','front yard');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+-------------+------------+------------+
| id | name | date | origin |
+----+-------------+------------+------------+
| 1 | housefly | 2001-09-10 | kitchen |
| 2 | millipede | 2001-09-10 | driveway |
| 3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)
|
Obtain AUTO_INCREMENT Values:
LAST_INSERT_ID( ) is a SQL function, so you can use it from within any client
that understands how to issue SQL statements. otherwise PERL and PHH scripts
provide exclusive functions to retrieve auto incremented value of last record.
PERL Example:
Use the mysql_insertid attribute to obtain the AUTO_INCREMENT value generated
by a query. This attribute is accessed through either a database handle or a
statement handle, depending on how you issue the query. The following example
references it through the database handle:
$dbh->do ("INSERT INTO insect (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq = $dbh->{mysql_insertid};
|
PHP Example:
After issuing a query that generates an AUTO_INCREMENT value, retrieve the
value by calling mysql_insert_id( ):
mysql_query ("INSERT INTO insect (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysql_insert_id ($conn_id);
|
Renumbering an Existing Sequence:
There may be a case when you have deleted many records from a table and you
want to resequence all the records. This can be done by using a simple trick but
you should be very careful to do so if your table is having join with other
table.
If you determine that resequencing an AUTO_INCREMENT column is unavoidable,
the way to do it is to drop the column from the table, then add it again. The
following example shows how to renumber the id values in the insect table using
this technique:
mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
|
Starting a Sequence at a Particular Value:
By default MySQL will start sequence from 1 but you can specify any other
number as well at the time of table creation. Following is the example where
MySQL will start sequence from 100.
mysql> CREATE TABLE insect
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL, # type of insect
-> date DATE NOT NULL, # date collected
-> origin VARCHAR(30) NOT NULL # where collected
);
|
Alternatively, you can create the table and then set the initial sequence
value with ALTER TABLE.
mysql> ALTER TABLE t AUTO_INCREMENT = 100;
|
|