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!