sql >> Base de Datos >  >> RDS >> Oracle

MySQL equivalente de SEQUENCE.NEXTVAL de Oracle

http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html

3.6.9. Usando AUTO_INCREMENT

El atributo AUTO_INCREMENT se puede usar para generar una identidad única para filas nuevas:

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;
Which returns:

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

No se especificó ningún valor para la columna AUTO_INCREMENT, por lo que MySQL asignó números de secuencia automáticamente. También puede asignar explícitamente NULL o 0 a la columna para generar números de secuencia.

Puede recuperar el valor AUTO_INCREMENT más reciente con la función SQL LAST_INSERT_ID() o la función C API mysql_insert_id(). Estas funciones son específicas de la conexión, por lo que sus valores de retorno no se ven afectados por otra conexión que también esté realizando inserciones.

Utilice el tipo de datos entero más pequeño para la columna AUTO_INCREMENT que sea lo suficientemente grande como para contener el valor de secuencia máximo que necesitará. Cuando la columna alcanza el límite superior del tipo de datos, falla el próximo intento de generar un número de secuencia. Use el atributo UNSIGNED si es posible para permitir un mayor rango. Por ejemplo, si usa TINYINT, el número de secuencia máximo permitido es 127. Para TINYINT UNSIGNED, el máximo es 255. Consulte la Sección 11.2.1, “Tipos de enteros (valor exacto):INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” para los rangos de todos los tipos de enteros.

NotaPara una inserción de varias filas, LAST_INSERT_ID() y mysql_insert_id() en realidad devuelven la clave AUTO_INCREMENT de la primera de las filas insertadas. Esto permite que las inserciones de varias filas se reproduzcan correctamente en otros servidores en una configuración de replicación.

Si la columna AUTO_INCREMENT es parte de múltiples índices, MySQL genera valores de secuencia utilizando el índice que comienza con la columna AUTO_INCREMENT, si existe. Por ejemplo, si la tabla de animales contiene índices PRIMARY KEY (grp, id) e INDEX (id), MySQL ignoraría PRIMARY KEY para generar valores de secuencia. Como resultado, la tabla contendría una sola secuencia, no una secuencia por valor de grp.

Para comenzar con un valor AUTO_INCREMENT que no sea 1, establezca ese valor con CREATE TABLE o ALTER TABLE, así:

mysql> ALTER TABLE tbl AUTO_INCREMENT =100;Notas InnoDB

Para las tablas de InnoDB, tenga cuidado si modifica la columna que contiene el valor de incremento automático en medio de una secuencia de instrucciones INSERT. Por ejemplo, si usa una instrucción UPDATE para colocar un valor nuevo y más grande en la columna de incremento automático, un INSERT posterior podría encontrar un error de "Entrada duplicada". La prueba de si un valor de incremento automático ya está presente se produce si realiza una ELIMINACIÓN seguida de más instrucciones INSERTAR, o cuando confirma la transacción, pero no después de una instrucción ACTUALIZAR.

Notas de MyISAM

Para las tablas MyISAM, puede especificar AUTO_INCREMENT en una columna secundaria en un índice de varias columnas. En este caso, el valor generado para la columna AUTO_INCREMENT se calcula como MAX(auto_increment_column) + 1 WHERE prefijo=prefijo dado. Esto es útil cuando desea colocar datos en grupos ordenados.

CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;
Which returns:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

En este caso (cuando la columna AUTO_INCREMENT es parte de un índice de varias columnas), los valores de AUTO_INCREMENT se reutilizan si elimina la fila con el mayor valor de AUTO_INCREMENT en cualquier grupo. Esto sucede incluso para las tablas MyISAM, para las cuales los valores AUTO_INCREMENT normalmente no se reutilizan.

Lectura adicional

Más información sobre AUTO_INCREMENT está disponible aquí:

Cómo asignar el atributo AUTO_INCREMENT a una columna:Sección 13.1.17, "Sintaxis CREATE TABLE" y Sección 13.1.7, "Sintaxis ALTER TABLE".

Cómo se comporta AUTO_INCREMENT según el modo SQL NO_AUTO_VALUE_ON_ZERO:Sección 5.1.7, “Modos SQL del servidor”.

Cómo usar la función LAST_INSERT_ID() para encontrar la fila que contiene el valor AUTO_INCREMENT más reciente:Sección 12.14, “Funciones de información”.

Configuración del valor AUTO_INCREMENT que se utilizará:Sección 5.1.4, “Variables del sistema del servidor”.

AUTO_INCREMENT y replicación:Sección 16.4.1.1, “Replicación y AUTO_INCREMENT”.

Variables del sistema del servidor relacionadas con AUTO_INCREMENT (auto_increment_increment y auto_increment_offset) que se pueden usar para la replicación:Sección 5.1.4, “Variables del sistema del servidor”.

http://search.oracle.com/search/search?q=auto_increment&group=Documentation&x=0&y=0