Avatar billede lsskaarup Nybegynder
15. maj 2002 - 10:27 Der er 47 kommentarer og
1 løsning

Index og constraints

Hvordan tjekker jeg for om en attribut i en tabel har index og/eller constraints ?
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 10:29 #1
Index kan du tjekke i sysindexes
constraints kan du tjekke i sysconstraints
Avatar billede slash Nybegynder
15. maj 2002 - 10:29 #2
i enterprise man. -> vælg tabellen og vis den i design. Vælg table and index properties (finder du ved siden af Gem (afbilledet som en diskette)
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 10:31 #3
Jeg vil gerne gøre det via en query
Avatar billede slash Nybegynder
15. maj 2002 - 10:34 #4
sp_statistics tabelditogdat
Avatar billede slash Nybegynder
15. maj 2002 - 10:36 #5
og sp_helpconstraint dintabel
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 10:40 #6
I sp_statistics, hvad for en fortæller så noget om index ?
Avatar billede slash Nybegynder
15. maj 2002 - 10:43 #7
index_name, type etc. du kan slå det hele op i SQL books online!
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 10:45 #8
Denne SQL giver dig tabelnavn og indeksnavn for de indeks, der er oprettet

select    so.[Name] as Table_Name, SI.[Name] as Index_Name
from    SysIndexes SI
        inner join SysObjects SO
        on SI.[ID] = SO.[ID]
where    (SO.[Type]='U') and
        (SI.IndID not in (0, 255))
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 11:01 #9
Hvis der så er 2 attributter med index, hvordan får jeg så vist dem begge ?
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 11:21 #10
Hvad bruges (SI.IndID not in (0, 255)) til ? Betyder det at ID'et på attributten ikke må være 0 eller 255 ?
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 11:24 #11
Beskrivelsen for si.ID:
ID of table (for indid = 0 or 255). Otherwise, ID of table to which the index belongs.
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 11:30 #12
Jeg kan se at 0'et fjerner dem som ikke har index, men helt præcist hvad 255 gør har jeg ikke fundet ud af.
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 11:32 #13
Det ved jeg heller ikke helt præcist. Jeg har bygget det ud fra oplysninger i en dokumentation over SQL Serverens System-tabeller, som jeg har fået fat i.
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 11:39 #14
Okay, kan du så sige mig hvordan jeg får vist begge index-attributter fra sammen tabel ?

Kender du forresten en god side, på nettet hvor man kan finde oplysninger om de forskellige funktioner og deres betydning ?
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 11:39 #15
indid 255 er et internt index, som SQL Server bruger til tabeller med (n)text eller image data
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 11:41 #16
Hvordan er de index, du vil vise, defineret?
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 11:41 #17
Den sql, jeg gav dig, vil liste alle index fra en tabel
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 11:50 #18
Den her vil give dig alle default constraints (og måske også andre - jeg har ikke andet en default constraints)

select    distinct so.[Name] as Table_Name, sco.[Name] as Column_Name, sc.*
from    (    syscolumns sco
            inner join (    select    sysconstraints.[colid], so2.type, so2.xtype
                            from    sysconstraints
                                    inner join sysobjects so2
                                    on sysconstraints.constid = so2.[id]
                        ) sc
            on sco.colid = sc.colid
        ) inner join sysobjects so
        on sco.[ID] = so.[id]
where    so.[Type] = 'U'
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 12:21 #19
Jeg kan altså ikke så det til at skrive alle attributter som har index ud, heller ikke når jeg bevist kun tjekker i én tabel
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 12:24 #20
Hvad mener du med attributter? Felter?
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 12:33 #21
Jeg har en tabel ved navn "Track".

Denne indeholder attributterne titelId, titel, komponistInit, kunstnerId.

Her er der index på både titelId og kunstnerId, men den viser kun den¨ene, jeg kan ikke engang se hvilken en det er.
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 12:34 #22
Hvordan er index defineret?
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 12:42 #23
De er primary keys, er det det du mener
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 13:01 #24
Er det begge felter, som indgår i Primary Key? Har du nogle Create Index på tabellen?
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 13:05 #25
Nej jeg laver ikke index, begge indgår i primary key, og skulle jo derfor også få et index.
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 13:07 #26
Primary Key er en table constraint. Hvis du kigger i query analyser under en tabel, så står primary key ikke under index, men under constraints
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 13:13 #27
Den her giver dig de index, der er defineret via Create Index med de tilhørende feltet (en post per felt i index, sorteret efter feltets position i indekset)

select    so.[Name] as Table_Name, SI.[Name] as Index_Name, sik.*
from    (    SysIndexes SI
            inner join    (    select        top 100 percent sik2.[id], sik2.indid, sc2.[name]
                            from        sysindexkeys sik2
                                        inner join syscolumns sc2
                                        on sik2.[id] = sc2.[id] and sik2.colid = sc2.colid
                            order by    sik2.indid, sik2.keyno
                        ) sik
            on si.[id] = sik.[id] and si.indid = sik.indid
        ) inner join SysObjects SO
        on SI.[ID] = SO.[ID]
where    (SO.[Type]='U') and
        (SI.IndID not in (0, 255))
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 13:29 #28
Jeg har desværre ikke nogen query-analyser. Hvis primary key ikke er index men table constraint, hvorfor viser din første sql så at der index i en tilfældig tabel, når der kun er primary keys og almindelige attributter ?
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 13:37 #29
Jeg prøvede at lave en tabel med
create table
(
  ...
  primary key (feltliste)
)

Den sidste sql gav alle felter i Primary Key
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 13:50 #30
Det sidste sql har jeg så ikke lige fået til at virke endnu. Du skriver sysindexkeys... hvad er det ?
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 13:53 #31
Den melder også om fejl ved top 100...
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 13:59 #32
sysindexkeys er den systemtabel, som fortæller hvilke felter, der indgår i nøglen.

Har du husket percent efter top 100 - med diverse mellemrum?
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 14:02 #33
ja, jeg har copy/pastede lige hvad det angår. Jeg har også kigget i diverse bøger, og efter hvad de siger så står der også rigtigt.
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 14:05 #34
Så fjern order by linien og t"op 100 percent"
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 14:15 #35
Så er det den siger "Invalid object name 'sysindexkeys'."
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 14:17 #36
hvad siger select @@version?
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 14:19 #37
Microsoft SQL Server  6.50 - 6.50.258 (Intel X86)
    Jun 16 1997 11:46:49
    Copyright (c) 1988-1997 Microsoft Corporation
Avatar billede bennytordrup Nybegynder
15. maj 2002 - 14:21 #38
Så tror f*nd*n... Jeg har arbejdet ud fra en SQL 2000. Sorry, jeg kan ikke hjælpe dig.
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 14:40 #39
Nå det er der ikke noget at gøre ved.
Avatar billede lsskaarup Nybegynder
15. maj 2002 - 18:47 #40
benny-tordrup: jeg har nu testet dine query's på min egen sql2000 server, og har virker de begge. Problemet er bare at det er til et skoleprojekt som skal kunne køre på skolen materiel, og de har kun sql 6.5.

Men hvis du kan finde en løsning som kan virke på sql 6.5, er jeg villig til at give det dobbelte antal point.
Avatar billede tormork Nybegynder
16. maj 2002 - 07:26 #41
Du kan prøve:

SELECT i.name AS CONSTRAINT_NAME, t_obj.name AS TABLE_NAME, col.name AS COLUMN_NAME, c_obj.xtype as KEY_TYPE
    FROM sysobjects c_obj, sysobjects t_obj, syscolumns col, master.dbo.spt_values v, sysindexes i
    WHERE c_obj.xtype IN ("UQ", "PK") And t_obj.id = c_obj.parent_obj AND t_obj.xtype = "U" AND t_obj.id = col.id AND
    col.name = index_col(t_obj.name, i.indid, v.number) AND t_obj.id = i.id AND c_obj.name = i.name AND
    v.number > 0 AND v.number <= i.keycnt AND v.type = "P"

Den virker i min SQL 6.5 og returnerer: ConstraintName, TableName, ColumnName, Key_Type. Jeg har lavet den for en tid siden så jeg kan ikke huske alle detaljerne, men den skulle få dig minst halvejs til målet :)
Avatar billede tormork Nybegynder
16. maj 2002 - 07:34 #42
Det var også noget vrøvl. Det er en sql 7.0 jeg her her. Sorry jeg troede at det var en 6.5
Avatar billede bennytordrup Nybegynder
16. maj 2002 - 08:29 #43
Jeg har ikke nogen 6.5 og er ikke interesseret i at få fat i en. Vi bruger 2000 som back end database i en kommerciel applikation.
Avatar billede lsskaarup Nybegynder
21. maj 2002 - 22:24 #44
Er der andre som har nogle forslag må I gerne komme med dem
Avatar billede lsskaarup Nybegynder
05. juni 2002 - 00:06 #45
Okay, jeg har nu selv fundet en løsning. Først for constraints, som returnere navnet på constraintstypen, hvis der er nogen eller null.

"+aid+" er attributtens id og '"+tabel+"' navnet på tabellen som attributten er på. De bliver i dette tilfælde leveret fra en jsp-side.

SELECT sysconstraints.status

FROM sysconstraints, sysobjects, syscolumns, syscomments, attributKommentar, systypes

where syscolumns.colid = "+aid+" and sysobjects.name = '"+tabel+"' and sysobjects.id=syscolumns.id and systypes.usertype = syscolumns.usertype and sysobjects.type = 'u' and tabelId = sysobjects.id and aId = syscolumns.colid and sysconstraints.id = sysobjects.id and syscolumns.colid = sysconstraints.colid and sysconstraints.constid =syscomments.id
Avatar billede lsskaarup Nybegynder
05. juni 2002 - 00:08 #46
Hov jeg glemte at fortæller at aId ved "aId = syscolumns.colid" kommer fra min attributKommentar-tabel
Avatar billede lsskaarup Nybegynder
05. juli 2002 - 20:22 #47
Endelige fandt jeg queryen der kan hente index. Det vil sige næsten, den virker ikke på alle typer af constraints, jeg kan ikke lige huske hvilken.

SELECT syscolumns.name FROM syscolumns, sysindexes, sysobjects WHERE sysobjects.id = syscolumns.id AND syscolumns.id = sysindexes.id AND convert(int,convert(varbinary(3),sysindexes.keys1))%256= syscolumns.colid AND syscolumns.name = '"+attribut+"' AND sysobjects.name = '"+tabel+"'"

"+attribut+" erstattes med den aktuelle attribut og "+tabel+" med den aktuelle tabel.
Avatar billede lsskaarup Nybegynder
05. juli 2002 - 20:23 #48
Det skulle have været et svar
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