MySQL Tutorial/Table/AUTO INCREMENT
Версия от 13:44, 26 мая 2010; (обсуждение)
Содержание
For a multiple-row insert, LAST_INSERT_ID() returns the AUTO_INCREMENT key from the first of the inserted rows
mysql>
mysql>
mysql>
mysql> CREATE TABLE employee (
-> id MEDIUMINT NOT NULL AUTO_INCREMENT,
-> name CHAR(30) NOT NULL,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql>
mysql> INSERT INTO employee (name) VALUES ("A"),
-> ("B"),
-> ("C"),
-> ("D"),
-> ("E"),
-> ("F");
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql>
mysql> SELECT * FROM employee;
+----+------+
| id | name |
+----+------+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
| 5 | E |
| 6 | F |
+----+------+
6 rows in set (0.02 sec)
mysql>
mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
mysql>
mysql> drop table employee;
Query OK, 0 rows affected (0.01 sec)
mysql>
To start with an AUTO_INCREMENT value other than 1
mysql>
mysql> CREATE TABLE employee (
-> id MEDIUMINT NOT NULL AUTO_INCREMENT,
-> name CHAR(30) NOT NULL,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql>
mysql> desc employee;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | mediumint(9) | NO | PRI | NULL | auto_increment |
| name | char(30) | NO | | | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql>
mysql> ALTER TABLE employee AUTO_INCREMENT = 100;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> INSERT INTO employee (name) VALUES ("A"),
-> ("B"),
-> ("C"),
-> ("D"),
-> ("E"),
-> ("F");
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql>
mysql> SELECT * FROM employee;
+-----+------+
| id | name |
+-----+------+
| 100 | A |
| 101 | B |
| 102 | C |
| 103 | D |
| 104 | E |
| 105 | F |
+-----+------+
6 rows in set (0.00 sec)
mysql>
mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 100 |
+------------------+
1 row in set (0.00 sec)
mysql>
mysql> drop table employee;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql>
Use Auto_increment column as part of the key
mysql>
mysql> CREATE TABLE employee (
-> grp ENUM("A","B","C") NOT NULL,
-> id MEDIUMINT NOT NULL AUTO_INCREMENT,
-> name CHAR(30) NOT NULL,
-> PRIMARY KEY (grp,id)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql>
mysql> INSERT INTO employee (grp,name) VALUES ("A","A1"),
-> ("B","B1"),
-> ("C","C1"),
-> ("A","A2"),
-> ("B","B2"),
-> ("C","C2");
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql>
mysql> SELECT * FROM employee ORDER BY grp,id;
+-----+----+------+
| grp | id | name |
+-----+----+------+
| A | 1 | A1 |
| A | 2 | A2 |
| B | 1 | B1 |
| B | 2 | B2 |
| C | 1 | C1 |
| C | 2 | C2 |
+-----+----+------+
6 rows in set (0.00 sec)
mysql>
mysql>
mysql> drop table employee;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
You can retrieve the most recent AUTO_INCREMENT value with the LAST_INSERT_ID().
LAST_INSERT_ID() is connection-specific.
mysql>
mysql>
mysql> CREATE TABLE employee (
-> id MEDIUMINT NOT NULL AUTO_INCREMENT,
-> name CHAR(30) NOT NULL,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql>
mysql> desc employee;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | mediumint(9) | NO | PRI | NULL | auto_increment |
| name | char(30) | NO | | | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql>
mysql> INSERT INTO employee (name) VALUES ("A");
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> SELECT * FROM employee;
+----+------+
| id | name |
+----+------+
| 1 | A |
+----+------+
1 row in set (0.00 sec)
mysql>
mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
mysql>
mysql> drop table employee;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>