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

MySQL-ækvivalent til Oracles SEQUENCE.NEXTVAL

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

3.6.9. Bruger AUTO_INCREMENT

AUTO_INCREMENT-attributten kan bruges til at generere en unik identitet for nye rækker:

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

Der blev ikke angivet nogen værdi for kolonnen AUTO_INCREMENT, så MySQL tildelte automatisk sekvensnumre. Du kan også udtrykkeligt tildele NULL eller 0 til kolonnen for at generere sekvensnumre.

Du kan hente den seneste AUTO_INCREMENT-værdi med LAST_INSERT_ID() SQL-funktionen eller mysql_insert_id() C API-funktionen. Disse funktioner er forbindelsesspecifikke, så deres returværdier påvirkes ikke af en anden forbindelse, som også udfører indsættelser.

Brug den mindste heltalsdatatype til AUTO_INCREMENT-kolonnen, der er stor nok til at indeholde den maksimale sekvensværdi, du skal bruge. Når kolonnen når den øvre grænse for datatypen, mislykkes næste forsøg på at generere et sekvensnummer. Brug UNSIGNED-attributten, hvis det er muligt for at tillade et større område. For eksempel, hvis du bruger TINYINT, er det maksimalt tilladte sekvensnummer 127. For TINYINT UNSIGNED er maksimum 255. Se afsnit 11.2.1, "Heltalstyper (nøjagtig værdi) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” for intervallerne for alle heltaltyperne.

Bemærk For en insert med flere rækker, returnerer LAST_INSERT_ID() og mysql_insert_id() faktisk AUTO_INCREMENT-nøglen fra den første af de indsatte rækker. Dette gør det muligt for indsættelser med flere rækker at blive gengivet korrekt på andre servere i en replikeringsopsætning.

Hvis AUTO_INCREMENT-kolonnen er en del af flere indekser, genererer MySQL sekvensværdier ved hjælp af indekset, der begynder med AUTO_INCREMENT-kolonnen, hvis der er en. For eksempel, hvis dyretabellen indeholdt indekser PRIMÆR NØGLE (grp, id) og INDEX (id), ville MySQL ignorere PRIMÆR NØGLE til generering af sekvensværdier. Som et resultat heraf ville tabellen indeholde en enkelt sekvens, ikke en sekvens pr. grp-værdi.

For at starte med en AUTO_INCREMENT-værdi, der ikke er 1, skal du indstille denne værdi med CREATE TABLE eller ALTER TABLE, sådan her:

mysql> ALTER TABLE tbl AUTO_INCREMENT =100;InnoDB Notes

For InnoDB-tabeller skal du være forsigtig, hvis du ændrer kolonnen, der indeholder auto-increment-værdien i midten af ​​en sekvens af INSERT-sætninger. For eksempel, hvis du bruger en UPDATE-sætning til at indsætte en ny, større værdi i kolonnen med automatisk stigning, kan en efterfølgende INSERT støde på en "Duplicate entry"-fejl. Testen af, om en automatisk stigningsværdi allerede er til stede, sker, hvis du udfører en DELETE efterfulgt af flere INSERT-sætninger, eller når du COMMIT transaktionen, men ikke efter en UPDATE-sætning.

MyISAM-noter

For MyISAM-tabeller kan du angive AUTO_INCREMENT på en sekundær kolonne i et indeks med flere kolonner. I dette tilfælde beregnes den genererede værdi for AUTO_INCREMENT-kolonnen som MAX(auto_increment_column) + 1 WHERE-præfiks=givet-præfiks. Dette er nyttigt, når du vil placere data i ordnede 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 dette tilfælde (når AUTO_INCREMENT-kolonnen er en del af et indeks med flere kolonner), genbruges AUTO_INCREMENT-værdier, hvis du sletter rækken med den største AUTO_INCREMENT-værdi i en gruppe. Dette sker selv for MyISAM-tabeller, hvor AUTO_INCREMENT-værdier normalt ikke genbruges.

Yderligere læsning

Flere oplysninger om AUTO_INCREMENT er tilgængelig her:

Sådan tildeler du attributten AUTO_INCREMENT til en kolonne:Afsnit 13.1.17, "CREATE TABLE Syntax" og Afsnit 13.1.7, "ALTER TABLE Syntax".

Hvordan AUTO_INCREMENT opfører sig afhængigt af NO_AUTO_VALUE_ON_ZERO SQL-tilstand:Afsnit 5.1.7, "Server SQL-tilstande".

Sådan bruges LAST_INSERT_ID()-funktionen til at finde den række, der indeholder den seneste AUTO_INCREMENT-værdi:Afsnit 12.14, "Informationsfunktioner".

Indstilling af den AUTO_INCREMENT værdi, der skal bruges:Afsnit 5.1.4, "Server System Variables".

AUTO_INCREMENT og replikering:Afsnit 16.4.1.1, "Replikering og AUTO_INCREMENT".

Serversystemvariabler relateret til AUTO_INCREMENT (auto_increment_increment og auto_increment_offset), som kan bruges til replikering:Afsnit 5.1.4, "Serversystemvariabler".

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



  1. Installation af Oracle Forms and Reports 11g Release 2

  2. Sådan aktiveres langsomme forespørgselslogfiler i AWS RDS MySQL

  3. brew installer mysql på macOS

  4. Er det muligt at bruge brugerdefinerede aggregater (clr) med vinduesfunktioner (over)?