Hinweise zum neuen Forum
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

MySQL PRIMARY KEY / _rowid [erledigt]

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10363
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

MySQL PRIMARY KEY / _rowid [erledigt]

Beitrag von AUGE_OHR » Mo, 29. Sep 2014 17:39

Ich habe das Gegenstück von PostgreSQL Row_Number() entdeckt was beim "Navigieren" helfen könnte
If a PRIMARY KEY or UNIQUE index consists of only one column that has an integer type,
you can also refer to the column as "_rowid" in SELECT statements.
man kann es dann an die FIELD Auswahl ( hier "*" ) anhängen und man hat eine zusätzliche Column

Code: Alles auswählen

SELECT *, _rowid FROM cTable WHERE blabla
UPDATE cTable SET NNR='1111' WHERE _rowid = 2
Frage : wie kann ich bei einer MySQL Table feststellen ob die einen PRIMARY KEY oder UNIQUE Index hat und welches FIELD es ist ?
Zuletzt geändert von AUGE_OHR am Di, 30. Sep 2014 2:36, insgesamt 1-mal geändert.
gruss by OHR
Jimmy

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1867
Registriert: Fr, 08. Feb 2008 22:29

Re: MySQL PRIMARY KEY / _rowid

Beitrag von georg » Mo, 29. Sep 2014 19:46

Hallo, Jimmy -


DESCRIBE TABLE

Aber sei bitte vorsichtig, _rowid sieht mir sehr stark nach einer Anbieter-spezifischen Erweiterung aus. Es ist quasi ein Alias für die Spalte, die als PRIMARY KEY dient.

Bei MySQL heisst das entsprechende Attribut AUTO_INCREMENT und es kann in einer Tabelle nur einer Spalte zugewiesen werden.

Die Numerierung ist aber nicht konsekutiv, sondern willkürlich, sobald Du den ersten Datensatz gelöscht hast:

Die Feldinhalte werden nicht "aktualisiert", sondern behalten ihren Wert. Besonders ärgerlich ist das, wenn Du eine Tabelle mit "DELETE FROM meinetabelle" völlig leer machst und einen neuen Datensatz schreibst. Das Schlüsselfeld bekommt nicht den Wert 1, sondern den höchsten, bisher vergebenen Wert + 1. Ein Gedächtnis wie ein Elefant, wie wir so sagen. Wenn man das im Hinterkopf behält, kann man ein solches Verfahren verwenden.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10363
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: MySQL PRIMARY KEY / _rowid

Beitrag von AUGE_OHR » Mo, 29. Sep 2014 21:45

georg hat geschrieben:DESCRIBE TABLE
Aha, Ja.
DESCRIBE, EXPLAIN und SHOW COLUMNS geben mir die Antwort.
georg hat geschrieben:Aber sei bitte vorsichtig, _rowid sieht mir sehr stark nach einer Anbieter-spezifischen Erweiterung aus. Es ist quasi ein Alias für die Spalte, die als PRIMARY KEY dient.
ich habe das aus
MySQL 5.6 Reference Manual, Seite 1431
wo es nur kurz angerissen wird.
georg hat geschrieben:Bei MySQL heisst das entsprechende Attribut AUTO_INCREMENT und es kann in einer Tabelle nur einer Spalte zugewiesen werden.

Die Numerierung ist aber nicht konsekutiv, sondern willkürlich, sobald Du den ersten Datensatz gelöscht hast:

Die Feldinhalte werden nicht "aktualisiert", sondern behalten ihren Wert. Besonders ärgerlich ist das, wenn Du eine Tabelle mit "DELETE FROM meinetabelle" völlig leer machst und einen neuen Datensatz schreibst. Das Schlüsselfeld bekommt nicht den Wert 1, sondern den höchsten, bisher vergebenen Wert + 1. Ein Gedächtnis wie ein Elefant, wie wir so sagen. Wenn man das im Hinterkopf behält, kann man ein solches Verfahren verwenden.
tja und dem Fall würde ja dann _rowid helfen weil das der effektiven ROW Anzahl im Resultset angepasst ist.
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10363
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: MySQL PRIMARY KEY / _rowid [erledigt]

Beitrag von AUGE_OHR » Di, 30. Sep 2014 2:43

Nachtrag : so finde ich es mit DESCRIBE einen PRIMARY KEY Eintrag

Code: Alles auswählen

LOCAL cSql     := "DESCRIBE "+cTable
   ...
   // "DESCRIBE "+cTable
   aRes := ::oCon:QuerySql( cSql )

   // search for internal Field
   nRecord := ASCAN(aRes,{|x| UPPER(x[1]) = "__RECORD"} )
   IF nRecord > 0
      nRow := nRecord
   ELSE
      // search for any PRIMARY KEY
      nRow := ASCAN(aRes,{|x| "PRI" $ UPPER( x[4] ) } )
      IF nRow > 0
         AADD(aFields,{"_rowid","N",11,0})
      ENDIF
   ENDIF
das funktioniert zumindest mit einem PRIMARY KEY ...
gruss by OHR
Jimmy

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste