[ORACLE] Autonummering zonder gaten

Pagina: 1
Acties:

  • descon
  • Registratie: Oktober 2002
  • Laatst online: 00:21
Hey

Ik wil een autonummering maken voor een database. Nu is het mij wel gelukt om door middel van een sequence een autonummering te maken maar als ik een record verwijder gaat de nummering gewoon door met het hoogste nummer.

Ik wil een sequence maken die de gaten gaat opvullen. Bijv ik heb een nummering van 1 tm 100 en ik verwijder recordnr 67. Nu wil ik dus dat het volgende nummer niet 101 wordt maar nr 67 en dat hij daarna weer verder gaat bij 100.

Weet iemand hoe ik dit kan oplossen ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:56
Dat kan niet, die gebruikte sequences kan je niet recupereren.

Trouwens, waarom wil je het zo doen? Een sequence wordt meestal gebruikt voor een PK, en wat de waarde van die PK is, dat doet er toch niet toe?

https://fgheysels.github.io/


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ik zou het niet op die manier doen. Maar als je het echt wilt, Dan zal het een programmeerklusje worden. Oracle zelf heeft voor zover ik weet geen instellingen hiervoor.

Ik vind het altijd wel leuke informatie, die gaten. Dan heb je een idee hoe je database gebruikt wordt

Siditamentis astuentis pactum.


  • Swa-baldie
  • Registratie: Juni 2002
  • Laatst online: 19-06-2023
triggertje op de tabel die naar de eerst niet bestaande waarde zoekt en deze dan toekent.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:56
Swa-baldie schreef op 22 maart 2004 @ 19:32:
triggertje op de tabel die naar de eerst niet bestaande waarde zoekt en deze dan toekent.
Mjah, da's gewoon lekker traag.

https://fgheysels.github.io/


  • Swa-baldie
  • Registratie: Juni 2002
  • Laatst online: 19-06-2023
whoami schreef op 22 maart 2004 @ 19:33:
[...]


Mjah, da's gewoon lekker traag.
Maar wel een oplossing voor het probleem van de TS. Als hij dit graag zo wil is dit een oplossing.

[ Voor 16% gewijzigd door Swa-baldie op 23-03-2004 09:42 . Reden: gefatsoeneerd ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:27

Creepy

Tactical Espionage Splatterer

Swa-baldie schreef op 23 maart 2004 @ 09:36:
[...]


Maar wel een oplossing voor het probleem van de TS. Als hij dit graag zo wil is dit een oplossing.
De vraag blijft staan, WAAROM zou je dit willen?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Omdat het mooier is waarschijnlijk, in kan mij geen geval indenken waarbij de performance naar boven zou gaan.

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 00:04

ripexx

bibs

Swa-baldie schreef op 23 maart 2004 @ 09:36:
[...]
Maar wel een oplossing voor het probleem van de TS. Als hij dit graag zo wil is dit een oplossing.
Het probleem komt voort uit een model wat niet correct is. Het gebruik van een Autonummer veld heeft een bepaalde toepassing, namelijk oa het genereren van een unieke waarde. Met name bij FK en koppeltabellen wil je zo'n unieke waarde hebben. Verder is het maar de vraag of zo'n oplossing wel werkt want als je dataset te groot is of je hebt redelijk tot veel inserts/delete queries dan kan het nog al traag worden. ;)

buit is binnen sukkel


Verwijderd

Het volgende zou moeten werken in MS SQL en Oracle. Het gebruikt geen SEQUENCE.

uitgangspunt: een tabel met naam "table" en een integer primary key veld met de naam "id"
De query levert de eerste "vrije" id. Als de table leeg is werkt hij echter niet, er moet in ieder geval 1 record inzitten. Ik heb niet gekeken naar de performance. Doe ermee wat je wil :)

code:
1
2
3
4
5
6
7
select  min(id) + 1
from    table as t1
where   not exists (
               select  id
               from    table as t2
               where   t2.id = t1.id + 1
           )


[edit]
kleine wijziging... zo doet hij het ook als de tabel leeg is (alleen MS SQL) :
code:
1
2
3
4
5
6
7
select  isnull(min(id) + 1, 1)
from    table as t1
where   not exists (
               select  id
               from    table as t2
               where   t2.id = t1.id + 1
           )

[ Voor 45% gewijzigd door Verwijderd op 23-03-2004 11:09 ]


Verwijderd

Creepy schreef op 23 maart 2004 @ 09:43:
[...]

De vraag blijft staan, WAAROM zou je dit willen?
Factuurnr's e.d. moeten bv. netjes oplopen, bij gaten in de nummering kunnen bij controle bepaalde instantie's wel eens moeilijk doen.

Echter sequences is voor dit soort zaken niet bedoeld.

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:53

Reptile209

- gers -

@maui71: maar het is om diezelfde reden niet wenselijk om factuurnummers te verwijderen, waardoor het hele probleem al niet eens zal ontstaan. :)

Zo scherp als een voetbal!


Verwijderd

Factuurnr's e.d. moeten bv. netjes oplopen, bij gaten in de nummering kunnen bij controle bepaalde instantie's wel eens moeilijk doen.
Ik denk dat voor zulke zaken het in eerste instantie al niet mogelijk moet zijn om records te deleten. En als je niets delete heb je ook geen gaten :Y)

Waarom zou je gemaakte facturen deleten? Misschien een handige optie voor aannemers van de schiphol tunnel >:)

edit:
oops, iets te laat. moet sneller typen.

[ Voor 9% gewijzigd door Verwijderd op 23-03-2004 11:13 ]


  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Verwijderd schreef op 23 maart 2004 @ 11:03:
Het volgende zou moeten werken in MS SQL en Oracle. Het gebruikt geen SEQUENCE.

uitgangspunt: een tabel met naam "table" en een integer primary key veld met de naam "id"
De query levert de eerste "vrije" id. Als de table leeg is werkt hij echter niet, er moet in ieder geval 1 record inzitten. Ik heb niet gekeken naar de performance. Doe ermee wat je wil :)

code:
1
2
3
4
5
6
7
select  min(id) + 1
from    table as t1
where   not exists (
               select  id
               from    table as t2
               where   t2.id = t1.id + 1
           )
In combinatie met het query snapshot model van Oracle gaat dit zich heel onprettig gedragen als je concurrent inserts hebt. Effectief maak je hiermee namelijk inserts in je tabel single-threaded en omdat je dat zonder een serializable transaction doet mag je aardig wat rollbacks verwachten.
Zelfs in combinatie met een serializable transactie gaat dit volgens mij niet lekker. Niet in Oracle vanwege rollbacks, niet in MS SQL Server vanwege next-key locking wat niet alleen je insert maar je hele transactie single threaded maakt. Als je je transactie beperkt tot alleen maar de insert dan gaat de kans dat je concurrent inserts hebt natuurlijk omlaag, maar als het gebeurt ben je nog steeds de pineut.

Verwijderd

Reptile209 schreef op 23 maart 2004 @ 11:11:
@maui71: maar het is om diezelfde reden niet wenselijk om factuurnummers te verwijderen, waardoor het hele probleem al niet eens zal ontstaan. :)
hehe, facturen verwijder je niet natuurlijk. Het probleem dat er gaten kunnen ontstaan bij sequences is als er iets fout gaat in de gehele transactie, als een applicatie bv. eerst het factuurnr genereerd en vervolgens de factuurregels, en bij de factuurregels gaat iets mis, dan zal bv. de hele transactie (incl aanmaken factuur met factuurnr) gerollbacked worden. Echter indien je van sequences gebruik maakt (en daar je factuurnr op baseer), zal er dus een gat ontstaan omdat die sequence niet gerollbacked wordt.
Pagina: 1