PostgreSQL "Lastrec()" [erledigt]

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

PostgreSQL "Lastrec()" [erledigt]

Beitrag von AUGE_OHR »

hi,

ich möchte nur wissen wie viele "Records" in einer Table insgesamt sind.

Code: Alles auswählen

METHOD PGUDialog:MaxTableLen()
LOCAL aClone := ACLONE(::aBroFields)  // alle gewählten Fields
LOCAL cField
LOCAL cTable
LOCAL cWhere
LOCAL cOrder
LOCAL oResult
LOCAL nSec

   // das kürzeste Field 
   ASort( aClone,,, {|aX,aY| aX[ DBS_LEN  ] < aY[ DBS_LEN  ] } )

   cField := aClone[1][DBS_NAME]
   cTable := ::cTable
   cWhere := ""
   cOrder := ""

   StartStop("START")
   oResult := ::oPG:Select( cField, cTable, cWhere, cOrder )
   nSec := StartStop("STOP")

   ::nMaxTBlen := oResult:rows
leider dauert das bei > 500000 immer noch 3.25 Sec ( P4 3Ghz )

... mir würde ein "geschätzt", nicht "gezählt", auch schon reichen ;)
geschaetz_nicht_gezaehlt.PNG
geschaetz_nicht_gezaehlt.PNG (25.66 KiB) 13293 mal betrachtet
Zuletzt geändert von AUGE_OHR am Mi, 18. Jul 2012 4:33, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: PostgreSQL "Lastrec()"

Beitrag von Martin Altmann »

Moin,
probiere es doch mal mit

Code: Alles auswählen

SELECT COUNT (*) FROM table;
Kann natürlich noch mit WHERE entsprechend eingegrenzt werden.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()"

Beitrag von AUGE_OHR »

Martin Altmann hat geschrieben:probiere es doch mal mit

Code: Alles auswählen

SELECT COUNT (*) FROM table;
mit 4.08 Sec leider nicht schneller.
"WHERE" nützt mir hier doch nichts weil ich "alle" haben möchte, oder ?

Frage : wenn ich das so absetze

Code: Alles auswählen

   cSql := "SELECT COUNT (*) FROM " + ::cTable

   StartStop("START")
   ::oPG:Exec( cSql )
   nSec := StartStop("STOP")

   oResult := ::oPG:result
em ... äh ... wo ist dann mein "Ergebnis" ? in oResult:rows steht 0
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Lastrec()"

Beitrag von georg »

Hallo, Jimmy -


SELECT COUNT(*) FROM table

sollte der schnellste Weg sein, da der Server "wissen" sollte, wie viele Einträge eine Tabelle hat, d.h. der Server muss die Tabelle nicht sequentiell lesen und die Sätze auf diese Art und Weise zählen. Wenn eine Bedingung hinzukommt, sieht das anders aus.

Jeder mir bekannte SQL Server (bisher keine Erfahrungen mit PostgreSQL) liefert auf ein SELECT ein Result Set, und auf das obige SELECT erfolgt ein {42}, d.h. ein Result Set mit einer Zeile, und einer Spalte. Diese eine Spalte enthält die Anzahl Sätze.

Nochmals mein Hinweis auf den PostgreSQL Interpreter: probiere es dort aus, der sollte das gleiche Ergebnis liefern wie Dein Programm. Andernfalls wäre ein Blick auf die Fehlerschnittstelle angeraten.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()"

Beitrag von AUGE_OHR »

georg hat geschrieben:Jeder mir bekannte SQL Server (bisher keine Erfahrungen mit PostgreSQL) liefert auf ein SELECT ein Result Set, und auf das obige SELECT erfolgt ein {42}, d.h. ein Result Set mit einer Zeile, und einer Spalte. Diese eine Spalte enthält die Anzahl Sätze.
es war ein "doppelter" Fehler von mir ... #-o

Code: Alles auswählen

SELECT COUNT(*) FROM table
ist wohl der "allgemeine" Befehl und funktioniert "immer".

mein oben aufgeführte Method scheint ein wenig schneller aber alles > 1 Sec lagere ich gewöhnlich in einen Thread aus.
das geht auch in diesem Fall, ABER : ich hatte die "selbe Connection" verwendet !

wenn also 2 Threads auf die selbe Connection arbeiten und je einen SQL Befehl absenden bekomme ich 2 x Result zurück
wobei das 2nd Result das erste Result "überschreibt" ?!

Code: Alles auswählen

METHOD PGUDialog:ConnectSrv()
...
   ::oPG := PGSql() :new()
   IF ::oPG:connect( cConnect ) // try to connect
      ::oPG2 := PGSql() :new()    // second Connection ???
      ::oPG2:connect( cConnect )

METHOD PGUDialog:UseTable( oSelf )
...
   ::cQuery := "SELECT * FROM %1 LIMIT 1"
   IF ::oPG:Exec( ::cQuery )
      ::oPG2:Exec( ::cQuery ) // second Connection ???
      oThread:start( {|| ::MaxTableLen(::oPG2),::oPG2 } )
so kann ich nun den Thread laufen lassen und bekomme "unabhängige" Result Ergebinisse.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von AUGE_OHR »

Nachtrag : obwohl das Thema [erledigt] ist ...

noch eine Frage : im Bild oben sieht man doch "geschätzt" und "gezählt" ... wie kommt man "da" ran ?

im Thread "Trigger" wurde ja schon mal auf "Sequenzen" hingedeutet ... wie steht das im "Zusammenhang" ?

Code: Alles auswählen

"__record" -> 
Type "serial" -> 
"PRIMARY KEY" -> 
"nextval()" statt "hochzählen" -> 
"Trigger" -> 
"AFTER" update -> 
"Sequenzen" -> 
"gezählt"
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von Martin Altmann »

Moin Jimmy,
Du könntest mit geschätzt natürlich versuchen, den nextval Deines ____record zu bekommen.
Problem dabei:
Lücken werden "mitgezählt" und der Counter wird (wahrscheinlich) dauerhaft bei jeder Abfrage um eins erhöht.
Andere Möglichkeit wäre:

Code: Alles auswählen

SELECT MAX(____record) FROM table;
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von AUGE_OHR »

Martin Altmann hat geschrieben:Du könntest mit geschätzt natürlich versuchen, den nextval Deines ____record zu bekommen.
"wie" führe ich "nextval()" aus ?
ich "denke" es hat hiermit was zu tun

Code: Alles auswählen

CREATE OR REPLACE FUNCTION isam_tablemeta_update()
...
ALTER FUNCTION isam_tablemeta_update() OWNER TO postgres;
was in den "Triggern" steht.
wer Lust hat kann sich den Code in PgAdmin.EXE mal ansehen was Alaska da macht.
Martin Altmann hat geschrieben:Problem dabei:
Lücken werden "mitgezählt" und der Counter wird (wahrscheinlich) dauerhaft bei jeder Abfrage um eins erhöht.
ok ... "das" ist wohl eins der Probleme die mit pgDBE auftreten "könnten" wenn es crasht.

Frage : und was dann ? neu "nummerieren" ? ... sollte man mal Alaska fragen ...
Martin Altmann hat geschrieben:Andere Möglichkeit wäre:

Code: Alles auswählen

SELECT MAX(__record) FROM table;
das sieht interessant aus ...
Query : SELECT MAX(__record) FROM fs_ustrich
Table have 1 entry 0.11 Sec.
create Index 0.00 Sec.
das war es noch nicht ...
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von georg »

Hallo,


zu dieser Frage lohnt sich immer ein Blick in die entsprechende Dokumentation des Servers. Wenn Alaska die AUTOINCREMENT Clause verwendet, sollte deren Beschreibung Aufschluss geben. Manche Server nehmen (SELECT Max(keyfeld) FROM table) + 1, manche nehmen (SELECT Max(from_any_keyfeld_in_the_past) FROM table) + 1.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von Martin Altmann »

Moin,
AUGE_OHR hat geschrieben:
Martin Altmann hat geschrieben:Andere Möglichkeit wäre:

Code: Alles auswählen

SELECT MAX(__record) FROM table;
das sieht interessant aus ...
Query : SELECT MAX(__record) FROM fs_ustrich
Table have 1 entry 0.11 Sec.
create Index 0.00 Sec.
das war es noch nicht ...
warum nicht? Selbstverständlich hat Deine Ergebnismenge nur einen Satz - sie enthält ja das Maximum des Wertes und das ist nun mal genau eine Zahl!
Du musst Dir also den Inhalt der Query anschauen :!:

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von brandelh »

Hi,

wenn du die aktuelle Anzahl wissen willst, darf man nicht nach dem höchsten Wert in der SEQUENCE Variablen fragen :!:
Die gelöschten Datensätze werden dort nicht abgezogen und auch ein VACUUM ändert diesen Wert nicht.

Außer natürlich Alaska hat genau dieses DBF Verhalten von PACK nachgebaut :D
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von brandelh »

Hi,

weiter oben steht du möchtest die Nummer des nächsten Satzes wissen, das geht grundsätzlich gar nicht !

Deine Abfrage liefert zwar die nummer des nächsten Satzes im Zeitpunkt deiner Abfrage, aber bis du einen anlegst, könnten hunderte andere schon hunderte von Datensätzen angelegt haben. Einer von denen trägt die dir gemeldete nächste Nummer ;-)

PS: wenn du natürlich den Server für dich alleine hast, nur dieses Programm darauf zugreift und ... könnte es klappen ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von AUGE_OHR »

Martin Altmann hat geschrieben:
Query : SELECT MAX(__record) FROM fs_ustrich
Table have 1 entry 0.11 Sec.
create Index 0.00 Sec.
das war es noch nicht ...
warum nicht? Selbstverständlich hat Deine Ergebnismenge nur einen Satz - sie enthält ja das Maximum des Wertes und das ist nun mal genau eine Zahl!
Du musst Dir also den Inhalt der Query anschauen :!:
danke für den Hinweis. hier nun der Snapshot
No_LastRec1.PNG
No_LastRec1.PNG (14.79 KiB) 13208 mal betrachtet
den Code sieht man ja im Snapshot.
ich habe es schon kapiert das ich im "Result" nachsehen muss aber wie du hier siehst liefert er mir 0 "rows" zurück.

es ist richtig das mit pgAdmin.EXE damit das "richtige" Ergebnis liefert aber der selbe String funktioniert "native" nicht"

hier noch so ein Code, von Edgar, der bei mir nicht läuft ( aber wohl bei ihm )

Code: Alles auswählen

SELECT reltuples FROM pg_class WHERE relname='customer'
damit zeigt er mit in pgAdmin.EXE die "geschätzte" Anzahl an.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von georg »

Guten Morgen, Jimmy -


wenn Du Dir den Inhalt von cQuery anschaust, dann sieht das so aus:

Code: Alles auswählen

SELECT MAX(__recno) FROM 'cTable'
Jetzt raten wir mal, was 'cTable' ist.

Eine Tabelle?
Falsch.

Ein Literal?
Richtig.

Welches ist der höchste Wert, den das (nicht vorhandene) Feld __recno im Literal 'cTable' enthält?
0

q.e.d.

Lass bitte die Hochkommata um Tabellen (und Feldnamen) weg, dann geht es.

Ansonsten habe ich eine kleine Funktion, mit der ich im Debugger den Inhalt einer Variablen ins Clipboard packen kann. Dann kopiere ich die in den SQL-Interpreter und sehe, was dort passiert.

Hatte ich Dir schon den Rat gegeben, mal den Interpreter zu versuchen und damit ein wenig "herumzuspielen"? Das lohnt sich immer!


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von AUGE_OHR »

georg hat geschrieben:wenn Du Dir den Inhalt von cQuery anschaust, dann sieht das so aus:

Code: Alles auswählen

SELECT MAX(__recno) FROM 'cTable'
ich hätte sagen sollen das ich "beides" ausprobiert habe. zuerst "ohne" und dann "mit" ... beides mit selben Ergebnis.
... da allerdings auch der Code von Edgar bei mir nicht "so" läuft frage ich mich ob es hier einen Unterschied macht.

Code: Alles auswählen

Edgar :

   ::oR_Table := oPG:Select( "pg_tables",, "schemaname = 'public'" )

METHOD PGSql:Select( cTable, cField, cWhere, cOrder, cLimit, cOffset )
...
   cSql := "SELECT " + cField + " FROM " + cTable
   IF !EMPTY( cWhere )
      cSql := cSql + " WHERE " + cWhere
   ENDIF
   IF !EMPTY( cOrder )
      cSql := cSql + " ORDER BY " + cOrder
   ENDIF
   IF !EMPTY( cLimit )                                      
      cSql := cSql + " LIMIT " + cLimit
   ENDIF
   IF !EMPTY( cOffset )                                    
      cSql := cSql + " OFFSET " + cOffset
   ENDIF
   ::exec( cSql )

Code: Alles auswählen

Jimmy :

   ::cQuery := "SELECT table_name FROM information_schema.tables " + ;
                     "WHERE table_schema = 'public'"
    IF ::oPG:Exec( ::cQuery )
also ganz am Anfang zur Auswahl der Table.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von georg »

Hallo, Jimmy -


es sind zwei verschiedene Ansätze:

Code: Alles auswählen

SELECT Max(feldname) FROM public
greift auf die Tabelle selbst zu, daher steht der Name der Tabelle ohne Anführungszeichen da.

Die Abfrage auf ein Schema (oder die interne Beschreibung der Tabellen, also quasi die Metadaten) verwendet den Tabellennamen als Argument, daher muss dieser dort in Anführungsstrichen stehen:

Code: Alles auswählen

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'
Warum probierst Du diese Anweisungen nicht mal im Interpreter aus. Normalerweise liefern die Interpreter recht aussagekräftige Fehlermeldungen, oder man kann aus einem

Code: Alles auswählen

SELECT Max(feldname) FROM table
ein

Code: Alles auswählen

SELECT feldname FROM table
machen und sehen, was passiert.

Du hast mit der dbPGE immer eine weitere Abstraktionsschicht dazwischen, und die kann (und wird) die eine oder andere Information rausfiltern.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von AUGE_OHR »

hi,
georg hat geschrieben:Du hast mit der dbPGE immer eine weitere Abstraktionsschicht dazwischen, und die kann (und wird) die eine oder andere Information rausfiltern.
aber ich muss ja über die Schnittstelle arbeiten und kann das nicht im Interpreter.

ob ich werde es mal ausprobieren und den Anfang ohne "information_schema.tables" ausprobieren.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von georg »

Hallo, Jimmy -


es kommt immer wieder mal vor, dass bei mir eine Anweisung "nicht funktioniert", dann kopiere ich sie eben in den Interpreter und dann sehe ich entweder direkt, was ich beim Zusammenstellen übersehen habe, oder aber beim Ausführen bekomme ich einen eindeutigeren Fehlerhinweis.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von AUGE_OHR »

georg hat geschrieben:dann kopiere ich sie eben in den Interpreter und dann sehe ich entweder direkt, was ich beim Zusammenstellen übersehen habe,
als Newbie gebe ich es meisten erst in den Interpreter ein um es "auszuprobieren" bevor ich es einbaue.
georg hat geschrieben:oder aber beim Ausführen bekomme ich einen eindeutigeren Fehlerhinweis.
Edgar hat mir mitgeteilt das jedes Result auch ein Resultstatus hat.
dieser "sollte" die Fehlermeldung enthalten:

Code: Alles auswählen

DO CASE
   CASE xT = PGRES_TUPLES_OK
   CASE xT = PGRES_COMMAND_OK
   CASE xT = PGRES_COPY_OUT
   CASE xT = PGRES_COPY_IN
   CASE xT = PGRES_EMPTY_QUERY
   CASE xT = PGRES_BAD_RESPONSE
   CASE xT = PGRES_NONFATAL_ERROR
   CASE xT = PGRES_FATAL_ERROR
ENDCASE
ob die Fehlermeldung "weiterhilft" ... das ist eine andere Sache.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "Lastrec()" [erledigt]

Beitrag von AUGE_OHR »

AUGE_OHR hat geschrieben:... mir würde ein "geschätzt", nicht "gezählt", auch schon reichen ;)
so nun hab ich es wohl raus "wie" es funktioniert.
http://ulf.zeitform.de/en/documents/pos ... ml#sec-2-1
Was MySQL über das Spalten-Attribut AUTOINCREMENT realisieren, wird in PostgreSQL über den Data Type SERIAL erreicht: die automatische Erzeugung eines eindeutigen, nicht-zufälligen Wertes.

Dabei greift PostgreSQL explizit auf eine „SEQUENCE“ zurück, die die eigentlichen Werte liefert.
ok das haben wir uns ja so gedacht... und wie legt man die an ?
PostgreSQL legt mit jedem SERIAL Type ein „SEQUENCE“ genanntes Datenbankobjekt an:
aha das passiert also automatisch beim Type "SERIAL"
aber wie ist es mit dem "hoch zählen" ?
Der Zugriff auf eine SEQUENCE erfolgt in der Regel über (in PostgreSQL vorhandene) Funktionen, hauptsächlich nextval() und currval()
ok soweit waren wir ja schon und wie sieht der (funktionierende) Code aus

Code: Alles auswählen

INSERT INTO customer VALUES (nextval('customer_id_seq'));
hm ... sowas hab ich doch schon mal gesehen ... richtig in den „SEQUENCE“ steht so was.

hier also nun in Xbase++

Code: Alles auswählen

cIns += "nextval('"+xtab+"___record_seq')"+","
man beachte die "___" ( 3x)
jetzt sind wir soweit das auch pgAdmin.EXE die Table öffnen / browsen kann ;)
(wenn Import mit ANSI geklappt hat.)

nun gibt es noch einen kleinen Bonus : LastRec

Code: Alles auswählen

"SELECT * FROM "+cTable+"_id_seq"
damit komme ich an de Eigenschaften einer SEQUENCE

Code: Alles auswählen

-[ RECORD 1 ]-+--------------------
sequence_name | customer_id_seq
last_value    | 1
increment_by  | 1
max_value     | 9223372036854775807
min_value     | 1
cache_value   | 1
log_cnt       | 1
is_cycled     | f
is_called     | f
der interessante Wert ist dabei last_value ( LastRec)
last_value den höchsten, für das derzeitige Backend reservierten Wert
der SEQUENCE
jetzt "denke" ich das der Thread wohl wirklich [erledigt] ist
gruss by OHR
Jimmy
Antworten