Številčenje v SQL podatkovnih bazah IV

Naslednji način pridobivanja številke (prvi del, drugi del, tretji del) pa je poenotena tabela za avtomatično številčenje različnih (poljubnih) elementov. Spet velja, da je to smiselno za MSSql in SQLite podatkovni bazi, saj Oracle pač uporablja sekvence.

Definirajmo torej enotno tablo za številčenje. Tabela bo imela 3 polja. Prvo polje je pač primarni ključ. Za to rešitev ga ne potrebujemo, vendar pa sem osebno pristaš pravila, da mora imeti vsaka tabela primarni ključ. Drugo polje je nek opis števca saj je želja, da se za vsak različen števec neodvisno številči. Tretje polje pa je pač števec sam. tabela s podatki bi torej izgledala takole:

ID   OPIS       ŠTEVILO
1    Dobavnica      1
2    Predračun      1
3    Predračun      2
4    Račun          1
5    Predračun      3
6    Račun          2
7    Dobavnica      2
8    Dobavnica      3
9    Dobavnica      4
10   Predračun      4
11   Dobavnica      5
12   Račun          3
13   Dobavnica      6

Definicija tabele

MSSql:

CREATE TABLE SEKVENCA
( ID        INT   IDENTITY(1,1)  NOT NULL
, OPIS      VARCHAR(15) NOT NULL
, STEVILO   INT         NOT NULL
);

SQLite:

CREATE TABLE SEKVENCA
( ID        INTEGER     NOT NULL
, OPIS      VARCHAR(15) NOT NULL
, STEVILO   INTEGER     NOT NULL

, PRIMARY KEY(ID)
);

Pridobivanje nove številke:

MSSql:

BEGIN TRANSACTION;
INSERT INTO SEKVENCA (OPIS, STEVILO) VALUES('racun', (SELECT COALESCE(MAX(STEVILO) + 1, 1) FROM SEKVENCA WHERE OPIS = 'racun'));
COMMIT TRANSACTION;

SQLite:

BEGIN TRANSACTION;
INSERT INTO SEKVENCA (OPIS, STEVILO) VALUES('racun', (SELECT COALESCE(MAX(STEVILO) + 1, 1) FROM SEKVENCA WHERE OPIS = 'racun'));
COMMIT TRANSACTION;

OPOMBA: Uporaba transakcije je obvezna! Na pogled se zdi, da se izvaja INSERT stavek, ki je avtonamna akcija, toda znotraj INSERT stavka se izvaja še SELECT stavek in vmes se lahko vsebina podatkov spremeni!

Komentirajte prispevek

This site uses Akismet to reduce spam. Learn how your comment data is processed.