[Adodb Lite / Postgresql / PHP] Correcte manier insert_id

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Op dit moment ben ik met een project bezig waarbij ik AdoDB lite icm met postgresql moet gebruiken. Nu wil ik na een instert query de nieuwe id ophalen, dus ik dacht dat te doen door

$db->Insert_ID();

waarbij $db het adodb lite object is. Helaas geeft die false terug, en dat blijkt te gebeuren als het niet gesupport wordt. (de insert query werkt wel goed).

Mijn tabel structuur heb ik d.m.v pgAdmin3 gemaakt:

ALTER TABLE events ALTER COLUMN uid SET DEFAULT nextval('event_seq'::regclass);
CREATE SEQUENCE event_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 17
CACHE 1;

Ik heb al het e.e.a. gevonden; ik zou eerst curval( 'event_seq' ) moeten doen en dan de insert, waarbij de uid expliciet opgegeven wordt. Lijkt mij omslachtig, en onveilig. Kan er tussentijds niet een andere toegevoegd worden met hetzelfde id? Of word die met het aanroepen van curval() al vergeven?

Is er niet een nettere manier via AdoDB? En is mijn tabelstructuur hier uberhaubt wel goed voor?

Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • dixon
  • Registratie: Januari 2001
  • Laatst online: 11-08 19:36
Beste RoemerV,

ik heb een andere methode. Deze is misschien iets omslachtiger en minder snel qua performance maar werkt altijd goed. Als volgt;

- voeg een char(10) veld toe aan je tabel (ik noem deze strUnique)
- maak een functie GenerateUniqueString die een random string van 10 lang returned
- voeg deze unieke string toe bij je INSERT statement/procedure
- maak een functie GetNewID(strSQL) die de nieuwe ID opvraagt met deze unieke string

Nu heb ik de functie zo gemaakt dat deze maximaal 10 keer met een interval/delay van 200msec het nieuwe ID opvraagt. De interval is een beetje afhankelijk van hoe snel de database is. Misschien wil je een kortere interval. Of misschien vind je de snelheid minder belangrijk en wil je de server minder belasten dan doe je een hogere interval.

bijv. (in .net en uit het hoofd)

' Maak insert query
Dim strUnique As String = GenerateUniqueString()
Dim strSQL As String = "INSERT INTO tbl_Names (strName, strUnique) VALUES ('Jaap', '" & strUnique & "')"

' Query uitvoeren...
' die code bespaar ik je even

' Nieuwe query maken voor ID
strSQL = "SELECT ID_Name FROM tbl_Names WHERE strUnique = '" & strUnique & "'"

' Query weer uitvoeren etc..


Let op; zorg dat je GenerateUniqueString() goed werkt (mooie random strings). Je kunt natuurlijk ook eerst checken of er al een record is met die unieke string maar dat kost nog meer performance. Je kunt dan beter een unieke string van 20 chars lang maken oid.

Hopelijk heb je hier iets aan.

Wat een onzin..


Acties:
  • 0 Henk 'm!

  • gerbennn
  • Registratie: November 2003
  • Laatst online: 10-09 17:42
Verwijderd schreef op zaterdag 22 maart 2008 @ 19:51:

Ik heb al het e.e.a. gevonden; ik zou eerst curval( 'event_seq' ) moeten doen en dan de insert, waarbij de uid expliciet opgegeven wordt. Lijkt mij omslachtig, en onveilig. Kan er tussentijds niet een andere toegevoegd worden met hetzelfde id? Of word die met het aanroepen van curval() al vergeven?
Nee, dat gaat niet werken. Met currval() vraag je de laatst teruggegeven waarde in de huidige sessie van een bepaalde sequence op. Wat jij bedoelt kun je bereiken met nextval(). Dat is een functie die de volgende waarde van de sequence teruggeeft. Het is inderdaad omslachtig maar niet onveilig omdat nextval() gegarandeerd atomair is.

Waarschijnlijk is het makkelijker om gewoon een insert te doen en daarna met nextval() het gebruikte id op te vragen. Dat kan omdat nextval() session-local is.

</signature>