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

orakel - sekvenser uden sekvens

Selvom jeg stærkt vil anbefale det (foretrækker at bruge en enkelt sekvens og bare acceptere, at der vil være større huller end forventet), kan du bygge din egen pseudo-sekvenstabel

CREATE TABLE my_sequences (
  sequence_name VARCHAR2(30) PRIMARY KEY,
  sequence_val  NUMBER
);

indsæt et par rækker

INSERT INTO my_sequences( sequence_name, sequence_val )
  VALUES( 'GroupA', 1 );
INSERT INTO my_sequences( sequence_name, sequence_val )
  VALUES( 'GroupB', 1 );

og skriv derefter en funktion for at få den næste sekvensværdi

CREATE FUNCTION get_nextval( p_sequence_name IN VARCHAR2 )
  RETURN NUMBER
IS
  l_val NUMBER;
BEGIN
  SELECT sequence_val
    INTO l_val
    FROM my_sequences
   WHERE sequence_name = p_sequence_name
     FOR UPDATE;

  UPDATE my_sequences
     SET sequence_val = sequence_val + 1
   WHERE sequence_name = p_sequence_name;

  RETURN l_val;
END;

Dette vil låse rækken i tabellen for den bestemte sekvens, indtil transaktionen, der hentede den næste række, enten forpligtes eller ruller tilbage. Dette vil radikalt reducere skalerbarheden af ​​din applikation sammenlignet med at bruge Oracle-sekvenser ved at sikre, at kun én session kan indsætte en række for et bestemt group_name ad gangen - de andre vil blokere for at vente på sekvensen. Hvis du har et system med et relativt lille antal samtidige brugere (eller et relativt stort antal group_name værdier), som kan være acceptable for dig. Men generelt er det en dårlig praksis. Afhængigt af Oracle-versionen kan du muligvis bruge autonome transaktioner til at øge samtidigheden, men det tilføjer blot endnu en smule kompleksitet til løsningen. På det tidspunkt, hvor du virkelig er bekymret for skalerbarhed, vil du virkelig gerne skubbe hele designet tilbage og bare bruge en Oracle-sekvens.



  1. Hvordan får man størrelsen på tabellerne i en MySQL-database?

  2. MySQL hvad er den maksimale størrelse på en database?

  3. Når SIGTERM sendes, lukker den underordnede proces mysql-forbindelsen?

  4. Objektarray bygget fra JSON vises ikke på mit Google-kort