Seite 1 von 1

MySQL PRIMARY KEY / _rowid [erledigt]

Verfasst: Mo, 29. Sep 2014 17:39
von AUGE_OHR
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 ?

Re: MySQL PRIMARY KEY / _rowid

Verfasst: Mo, 29. Sep 2014 19:46
von georg
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.

Re: MySQL PRIMARY KEY / _rowid

Verfasst: Mo, 29. Sep 2014 21:45
von AUGE_OHR
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.

Re: MySQL PRIMARY KEY / _rowid [erledigt]

Verfasst: Di, 30. Sep 2014 2:43
von AUGE_OHR
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 ...