Avatar billede tien Nybegynder
21. januar 2005 - 10:22 Der er 16 kommentarer og
1 løsning

forespørge om en tabels struktur

Kan man med SQL forespørge om en tables struktur (primær nøgle, feltname osv.)
Avatar billede arne_v Ekspert
21. januar 2005 - 10:24 #1
DESCRIBE tabelnavn;
Avatar billede tien Nybegynder
21. januar 2005 - 10:24 #2
hvis tilfældet, hvordan?
Avatar billede tien Nybegynder
21. januar 2005 - 10:29 #3
jeg er egentlig kun interseret i feltnavnene som udgør primær nøglen
Avatar billede arne_v Ekspert
21. januar 2005 - 10:33 #4
Den fjerde kolonne i DESCRIBE output indeholder 'PRI' hvis det er en primær nøgle.
Avatar billede arne_v Ekspert
21. januar 2005 - 10:34 #5
Hov. Jeg lagde lige mærke til kategorien.

DESCRIBE er til MySQL.

Der er andre komamndoer til andre SQL dialekter.
Avatar billede tien Nybegynder
21. januar 2005 - 10:35 #6
det skal være DB2
Avatar billede arne_v Ekspert
21. januar 2005 - 10:42 #7
Skud fra hoften - prøv:

SELECT * FROM SYSIBM.SYSCOLUMNS
Avatar billede arne_v Ekspert
21. januar 2005 - 10:47 #8
SQL-92 har:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
Avatar billede tien Nybegynder
21. januar 2005 - 10:53 #9
virker ikke
Avatar billede tien Nybegynder
21. januar 2005 - 10:54 #10
det skal være noget i retning af:
describe indexes for table <<tabelnavn>> show detail
Avatar billede tien Nybegynder
21. januar 2005 - 10:55 #11
overstående virker kun fra en db2 command consol
Avatar billede tien Nybegynder
21. januar 2005 - 10:56 #12
jeg har brug for at gøre det fra mit program
Avatar billede hsg Nybegynder
21. januar 2005 - 19:24 #13
Så skal du følge arne_v's forslag:
SELECT * FROM SYSIBM.SYSCOLUMNS WHERE TBNAME = 'Dit indexnavn'

Kræver jo du kender det primære index. Men det kan hentes
fra SYSIBM.SYSINDEXES
Avatar billede kjulius Novice
22. januar 2005 - 02:51 #14
DB2 kører på mange platforme. Hvilken platform er der tale om?

Hvis du f.eks. kører på en iSeries, som er den platform jeg kender bedst, så skal du i stedet skrive:

SELECT * FROM QSYS2.SYSCOLUMNS WHERE TBNAME = 'dit tablename'

På iSeries er en primær key dog implementeret som en constraint, og vil derfor ikke fremgå direkte af SYSCOLUMNS.

Her vil man kunne finde primærnøgler via en forespørgsel som:

SELECT COL.COLUMN_NAME, COL.TABLE_NAME, COL.TABLE_SCHEMA, COL.CONSTRAINT_NAME, COL.CONSTRAINT_SCHEMA, CST.CONSTRAINT_TYPE
FROM QSYS2.SYSCSTCOL COL
INNER JOIN QSYS2.SYSCST CST ON COL.CONSTRAINT_NAME = CST.CONSTRAINT_NAME AND COL.CONSTRAINT_SCHEMA = CST.CONSTRAINT_SCHEMA
WHERE CST.CONSTRAINT_TYPE = 'PRIMARY KEY'
AND COL.TABLE_NAME = 'din tabel'

Jeg ved ikke, om dette hjælper dig. Som sagt, er dette måske specifikt for iSeries implementationen.

Alligevel tillader jeg mig at smide det som et svar. Hvis du er heldig, er det kun QSYS2 der skal udskiftes med SYSIBM.
Avatar billede hsg Nybegynder
23. januar 2005 - 18:33 #15
kjulius: Mon ikke indexet findes i SYSINDEXES med UNIQUERULE = 'P' selv på en iSeries?
Derfra er det nemt at kigge forbi syscolumns
Avatar billede kjulius Novice
23. januar 2005 - 22:53 #16
hsq: Nej, jeg har lige efterprøvet det. SYSINDEXES indeholder kun data for indexer, ikke tabeller. Hvis en tabel derfor bliver oprettet med en primær nøgle, bliver dette ikke reflekteret i SYSINDEXES. Det samme hvis tabellen oprettes med et UNIQUE index.

Hvis der derimod efterfølgende bliver oprettet et selvstændigt index med en UNIQUE key, vil dette fremgå af SYSINDEXES, hvor UNIQUERULE='U'.

Jeg kan forstå på dig, at dette ikke er en normal opførsel i en LUW (Linux/Unix/Windows) installation?

Selvfølgelig kunne man ønske sig, at hensynet til portabiliteten medførte, at også krydsreference-filerne blev ajourført på samme måde i alle versioner af DB2 UDB. Men det kommer nok. Man arbejder jo til stadighed på at gøre spændet mellem dem mindre.

Det skal dog siges, at mine observationer er baseret på V5R2M0. Der er senere, i sommeren 2004, kommet en release 3, altså V5R3M0, som kan have ændret forudsætningerne. Vi har endnu ikke fået denne installeret.
Avatar billede hsg Nybegynder
24. januar 2005 - 08:08 #17
kjulius: Du har ret jo... Jeg prøvede på 2 måder:

1)
Create table uden primary key
Create unique index på nøglefeltet
Alter table add primary key

2)
Create table med primary key

1) Indexet ændres i SYSINDEXES til UNIQERULE = 'P'

2) Der oprettes et index med UNIQUERULE = 'P'

så der er - desværre - stadig en lille forskel mellem AS/400 og LUW / 390 udgaven.

Men om det så hjælper spørgeren er jo en anden sag :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester