sql >> Databasteknik >  >> RDS >> Oracle

MySQL-motsvarighet till Oracles SEQUENCE.NEXTVAL

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

3.6.9. Använder AUTO_INCREMENT

Attributet AUTO_INCREMENT kan användas för att generera en unik identitet för nya rader:

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

Inget värde angavs för kolumnen AUTO_INCREMENT, så MySQL tilldelade sekvensnummer automatiskt. Du kan också uttryckligen tilldela NULL eller 0 till kolumnen för att generera sekvensnummer.

Du kan hämta det senaste AUTO_INCREMENT-värdet med LAST_INSERT_ID() SQL-funktionen eller mysql_insert_id() C API-funktionen. Dessa funktioner är anslutningsspecifika, så deras returvärden påverkas inte av en annan anslutning som också utför insättningar.

Använd den minsta heltalsdatatypen för AUTO_INCREMENT-kolumnen som är tillräckligt stor för att hålla det maximala sekvensvärdet du behöver. När kolumnen når den övre gränsen för datatypen misslyckas nästa försök att generera ett sekvensnummer. Använd om möjligt attributet UNSIGNED för att tillåta ett större räckvidd. Om du till exempel använder TINYINT är det högsta tillåtna sekvensnumret 127. För TINYINT UNSIGNED är det maximala 255. Se avsnitt 11.2.1, "Heltalstyper (exakt värde) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” för intervallen för alla heltalstyper.

Notera För en infogning med flera rader returnerar LAST_INSERT_ID() och mysql_insert_id() faktiskt AUTO_INCREMENT-nyckeln från den första av de infogade raderna. Detta gör att insättningar med flera rader kan reproduceras korrekt på andra servrar i en replikeringsinställning.

Om AUTO_INCREMENT-kolumnen är en del av flera index, genererar MySQL sekvensvärden med hjälp av indexet som börjar med AUTO_INCREMENT-kolumnen, om det finns en. Till exempel, om djurtabellen innehöll index PRIMARY KEY (grp, id) och INDEX (id), skulle MySQL ignorera PRIMARY KEY för att generera sekvensvärden. Som ett resultat skulle tabellen innehålla en enda sekvens, inte en sekvens per grp-värde.

För att börja med ett annat AUTO_INCREMENT-värde än 1, ställ in det värdet med CREATE TABLE eller ALTER TABLE, så här:

mysql> ALTER TABLE tbl AUTO_INCREMENT =100;InnoDB Notes

För InnoDB-tabeller, var försiktig om du ändrar kolumnen som innehåller auto-increment-värdet i mitten av en sekvens av INSERT-satser. Om du till exempel använder en UPDATE-sats för att sätta ett nytt, större värde i kolumnen för automatisk ökning, kan en efterföljande INSERT stöta på ett "Duplicate entry"-fel. Testet om ett automatiskt inkrementvärde redan är närvarande sker om du gör en DELETE följt av fler INSERT-satser, eller när du COMMIT transaktionen, men inte efter en UPDATE-sats.

MyISAM Notes

För MyISAM-tabeller kan du ange AUTO_INCREMENT på en sekundär kolumn i ett index med flera kolumner. I det här fallet beräknas det genererade värdet för kolumnen AUTO_INCREMENT som MAX(auto_increment_column) + 1 WHERE prefix=givet-prefix. Detta är användbart när du vill lägga in data i ordnade grupper.

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

I det här fallet (när AUTO_INCREMENT-kolumnen är en del av ett index med flera kolumner), återanvänds AUTO_INCREMENT-värden om du tar bort raden med det största AUTO_INCREMENT-värdet i någon grupp. Detta händer även för MyISAM-tabeller, för vilka AUTO_INCREMENT-värden normalt inte återanvänds.

Mer läsning

Mer information om AUTO_INCREMENT finns här:

Så här tilldelar du AUTO_INCREMENT-attributet till en kolumn:Avsnitt 13.1.17, "SKAPA TABELL-syntax" och Avsnitt 13.1.7, "ÄNDRA TABELL-syntax".

Hur AUTO_INCREMENT beter sig beroende på NO_AUTO_VALUE_ON_ZERO SQL-läge:Avsnitt 5.1.7, "Server SQL-lägen".

Så här använder du funktionen LAST_INSERT_ID() för att hitta raden som innehåller det senaste AUTO_INCREMENT-värdet:Avsnitt 12.14, "Informationsfunktioner".

Inställning av AUTO_INCREMENT-värdet som ska användas:Avsnitt 5.1.4, "Serversystemvariabler".

AUTO_INCREMENT och replikering:Avsnitt 16.4.1.1, "Replikering och AUTO_INCREMENT".

Serversystemvariabler relaterade till AUTO_INCREMENT (auto_increment_increment och auto_increment_offset) som kan användas för replikering:Avsnitt 5.1.4, "Serversystemvariabler".

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



  1. MySQL-skillnad mellan två rader i en SELECT-sats

  2. 12c Föråldrade funktioner

  3. java.lang.UnsatisfiedLinkError:ingen ocijdbc11 i java. bibliotek.sökväg

  4. SQL aritmetiska operatörer