MySQL PRIMARY KEY / _rowid [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

MySQL PRIMARY KEY / _rowid [erledigt]

Beitrag 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 ?
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: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: MySQL PRIMARY KEY / _rowid

Beitrag 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.
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: MySQL PRIMARY KEY / _rowid

Beitrag 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.
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: MySQL PRIMARY KEY / _rowid [erledigt]

Beitrag 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 ...
gruss by OHR
Jimmy
Antworten