Oracle
 sql >> Database >  >> RDS >> Oracle

Equivalente MySQL di SEQUENCE.NEXTVAL di Oracle

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

3.6.9. Utilizzando AUTO_INCREMENT

L'attributo AUTO_INCREMENT può essere utilizzato per generare un'identità univoca per le nuove righe:

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 |
+----+---------+

Non è stato specificato alcun valore per la colonna AUTO_INCREMENT, quindi MySQL ha assegnato automaticamente i numeri di sequenza. Puoi anche assegnare esplicitamente NULL o 0 alla colonna per generare numeri di sequenza.

È possibile recuperare il valore AUTO_INCREMENT più recente con la funzione SQL LAST_INSERT_ID() o la funzione API C mysql_insert_id(). Queste funzioni sono specifiche della connessione, quindi i loro valori restituiti non sono influenzati da un'altra connessione che esegue anche inserimenti.

Utilizzare il tipo di dati intero più piccolo per la colonna AUTO_INCREMENT che sia sufficientemente grande da contenere il valore di sequenza massimo necessario. Quando la colonna raggiunge il limite superiore del tipo di dati, il tentativo successivo di generare un numero di sequenza non riesce. Utilizzare l'attributo UNSIGNED se possibile per consentire un intervallo più ampio. Ad esempio, se si utilizza TINYINT, il numero di sequenza massimo consentito è 127. Per TINYINT UNSIGNED, il massimo è 255. Vedere Sezione 11.2.1, «Tipi interi (valore esatto) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” per gli intervalli di tutti i tipi interi.

NotaPer un inserimento a più righe, LAST_INSERT_ID() e mysql_insert_id() restituiscono effettivamente la chiave AUTO_INCREMENT dalla prima delle righe inserite. Ciò consente di riprodurre correttamente gli inserimenti a più righe su altri server in una configurazione di replica.

Se la colonna AUTO_INCREMENT fa parte di più indici, MySQL genera valori di sequenza utilizzando l'indice che inizia con la colonna AUTO_INCREMENT, se presente. Ad esempio, se la tabella degli animali contenesse gli indici PRIMARY KEY (grp, id) e INDEX (id), MySQL ignorerebbe la PRIMARY KEY per generare valori di sequenza. Di conseguenza, la tabella conterrebbe una singola sequenza, non una sequenza per valore grp.

Per iniziare con un valore AUTO_INCREMENT diverso da 1, imposta quel valore con CREATE TABLE o ALTER TABLE, in questo modo:

mysql> ALTER TABLE tbl AUTO_INCREMENT =100;Note InnoDB

Per le tabelle InnoDB, fai attenzione se modifichi la colonna contenente il valore di incremento automatico nel mezzo di una sequenza di istruzioni INSERT. Ad esempio, se si utilizza un'istruzione UPDATE per inserire un nuovo valore più grande nella colonna di incremento automatico, un successivo INSERT potrebbe riscontrare un errore "Voce duplicata". Il test se è già presente un valore di incremento automatico si verifica se esegui un DELETE seguito da più istruzioni INSERT o quando COMMIT la transazione, ma non dopo un'istruzione UPDATE.

Le mie note ISAM

Per le tabelle MyISAM, puoi specificare AUTO_INCREMENT su una colonna secondaria in un indice a più colonne. In questo caso, il valore generato per la colonna AUTO_INCREMENT viene calcolato come MAX(auto_increment_column) + 1 WHERE prefix=given-prefix. Questo è utile quando vuoi inserire i dati in gruppi ordinati.

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 |
+--------+----+---------+

In questo caso (quando la colonna AUTO_INCREMENT fa parte di un indice a più colonne), i valori AUTO_INCREMENT vengono riutilizzati se elimini la riga con il valore AUTO_INCREMENT più grande in qualsiasi gruppo. Questo accade anche per le tabelle MyISAM, per le quali normalmente i valori AUTO_INCREMENT non vengono riutilizzati.

Ulteriori letture

Maggiori informazioni su AUTO_INCREMENT sono disponibili qui:

Come assegnare l'attributo AUTO_INCREMENT a una colonna:Sezione 13.1.17, "Sintassi CREATE TABLE" e Sezione 13.1.7, "Sintassi ALTER TABLE".

Come si comporta AUTO_INCREMENT in base alla modalità SQL NO_AUTO_VALUE_ON_ZERO:Sezione 5.1.7, «Modalità SQL del server».

Come utilizzare la funzione LAST_INSERT_ID() per trovare la riga che contiene il valore AUTO_INCREMENT più recente:Sezione 12.14, «Funzioni informative».

Impostazione del valore AUTO_INCREMENT da utilizzare:Sezione 5.1.4, «Variabili di sistema del server».

AUTO_INCREMENT e replica:Sezione 16.4.1.1, "Replica e AUTO_INCREMENT".

Variabili di sistema del server relative ad AUTO_INCREMENT (auto_increment_increment e auto_increment_offset) che possono essere utilizzate per la replica:Sezione 5.1.4, «Variabili di sistema del server».

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