Autor Beitrag
moloch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Di 12.05.09 16:06 
Hallo Leute,
ich möchte einen Indize abfragen in einer Tabelle und wenn er nicht gesetzt ist setzen per SQL. setzen habe ich bisher so gemacht:

ausblenden SQL-Anweisung
1:
CREATE UNIQUE INDEX prima ON Tabelle (Spalte1)					


aber wie frage ich einen Indize ab damit ich nicht immer anlege beim Start des Programms?

Moderiert von user profile iconChristian S.: Delphi- durch SQL-Tags ersetzt
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Di 12.05.09 16:19 
müsste eigentliche eine DB-system-interne Tabelle geben, in der die Indexe stehen.
wie die bei deinem DB-System heisst -> siehe dein DB-Handbuch
die brauchste dann ja nur abfragen, ob's den Index gibt.

bei Interbase ist das irgend so ne RDB$... Tabelle, weiss den Namen nicht aus dem Kopf und hab auch gerade kein Handbuch da ;)

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 18.05.09 10:02 
also ich habe mich entschlossen die Indizes zu löschen und dann anzulegen.
mit dieser sql funktioniert es:

ausblenden SQL-Anweisung
1:
ALTER TABLE statusp DROP CONSTRAINT PK__STATUSP__6442E2C9					


das problem besteht jedoch daran den Schlüsselnamen auszulesen. In diesem Fall "PK__STATUSP__6442E2C9"
wie mache ich das?

beste grüße

Moderiert von user profile iconChristian S.: Delphi- durch SQL-Tags ersetzt
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 18.05.09 10:32 
IIRC mit SHOW INDEX FROM tabelle;

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 18.05.09 11:46 
IIRC?? kenne ich nicht.
mach doch bitte mal eine beispiel sql
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 18.05.09 11:49 
IIRC = If I Remember Correctly; und dein Beispiel steht nach dem "mit" ;-)

@Ramon: Oracle nutzt doch keiner ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.


Zuletzt bearbeitet von BenBE am Mo 18.05.09 12:12, insgesamt 1-mal bearbeitet
Ramon
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 107

WIN7
D6 Prof, D7 Prof, D 2009
BeitragVerfasst: Mo 18.05.09 12:03 
user profile iconmoloch hat folgendes geschrieben Zum zitierten Posting springen:

das problem besteht jedoch daran den Schlüsselnamen auszulesen. In diesem Fall "PK__STATUSP__6442E2C9"
wie mache ich das?


Hängt immer vom DBMS ab? Welche Datenbank nutzt du?

Oracle könntest du z.B. so: Select * from USER_INDEXES
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 18.05.09 12:15 
mssql
@benb ja das habe ich probiert. bei mssql funktioniert es nicht
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 18.05.09 12:24 
Finde auf die Schnelle nur das hier ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Ramon
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 107

WIN7
D6 Prof, D7 Prof, D 2009
BeitragVerfasst: Mo 18.05.09 12:27 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:

@Ramon: Oracle nutzt doch keiner ;-)

Ich schon :-P

Versuch mal das:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
SELECT O.NAME TABLE_NAME,s.name
AS INDEX_NAME
FROM SYSOBJECTS O, SYSINDEXES S
where O.TYPE = 'U'
and S.ID=O.ID
ORDER BY O.NAME
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 18.05.09 13:16 
hab was besseres gefunden

EXEC sp_helpindex "tabelle"

funktioniert super bei mssql zumindest
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mi 20.05.09 10:28 
Hallo,
also in MSSQL klappt jetzt alles super. Jetzt brauche ich nur noch für Oracel
den richtigen SQL- Befehl um die Indizes der jeweiligen Tabelle rauszufinden.
löschen habe ich schon gefunden:

ausblenden SQL-Anweisung
1:
2:
3:
drop index Indexname
//oder
ALTER TABLE Tabellenname DROP CONSTRAINT Constraintname
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 20.05.09 10:47 
ich glaube, du hast da einen Verständnisfehler:

Constraints sind was anderes als Indexe !!!

constraint = Definition von Integritätsbedingungen

Eine Constraint, die einen Primary Key definiert, erzeugt in der Regel auch automatisch einen Index, d.h. aber NICHT, das du nur den Index löscht, wenn du den Constraint löscht, sondern auch den Primary Key !!!!
ausblenden Delphi-Quelltext
1:
Drop Index indexName					

ist also die richtige Lösung, um NUR den Index zu entfernen.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Ramon
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 107

WIN7
D6 Prof, D7 Prof, D 2009
BeitragVerfasst: Mi 20.05.09 10:51 
user profile iconmoloch hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
also in MSSQL klappt jetzt alles super. Jetzt brauche ich nur noch für Oracel
den richtigen SQL- Befehl um die Indizes der jeweiligen Tabelle rauszufinden.


Hatte ich oben bereits geschrieben:
ausblenden SQL-Anweisung
1:
Select * from USER_INDEXES where TABLE_NAME = 'blup'					
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mi 20.05.09 11:08 
@zuma
Zitat:
ich glaube, du hast da einen Verständnisfehler:


ja das glaube ich auch. Für mich war immer ein Index auf einer Tabelle = PrimärIndex.
Also das was in der jeweiligen Spalte steht z.b. 1 darf nur einmal in der Tabelle stehen.
Da wäre es evtl erstmal hilfreich in deinen Worten vielleicht zu erfahren wo der unterschied liegt.


@Ramon
danke noch mal
Ramon
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 107

WIN7
D6 Prof, D7 Prof, D 2009
BeitragVerfasst: Mi 20.05.09 11:12 
Zitat:

Da wäre es evtl erstmal hilfreich in deinen Worten vielleicht zu erfahren wo der unterschied liegt.


Der Primary Key macht einen Datensatz eindeutig. Es wird in der Regel auch ein entsprechender Index über die Schlüsselfelder angelegt, da man davon ausgeht, dass in der Regel nach diesen selektiert/gesucht wird.

Zusätzliche Indizes über andere Spalten dienen der schnellere Selektion wenn diese Spalten durchsucht werden.

Zitat:

@Ramon
danke noch mal

Bitte
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mi 20.05.09 11:26 
ja ok verstehe. der grund warum ich auf constraint überhaupt komme ist, das ich bei mssql versucht hatte den Primärindex mit
 drop index tabellenname.indexname zu löschen. das ging nicht.
mit ALTER TABLE statusp DROP CONSTRAINT constraintname aber schon. im grunde gehts mir auch nur um Primärindizes jedoch war so der weg..

im grunde suche ich "nur" nach den richtigen sql's für
MSSQl, MySQL und Oracle
die die PrimärIndizes löschen damit ich sie danach wieder richtig anlegen kann. Sprich ein update möchte ich machen für die Indizes der jeweiligen Tabelle..
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 20.05.09 11:28 
[quote="]user profile iconmoloch
ja das glaube ich auch. Für mich war immer ein Index auf einer Tabelle = PrimärIndex.
Also das was in der jeweiligen Spalte steht z.b. 1 darf nur einmal in der Tabelle stehen.
Da wäre es evtl erstmal hilfreich in deinen Worten vielleicht zu erfahren wo der unterschied liegt.
[/quote]

Ein Primary Key ist KEIN Index, sondern, wie Ramon schon sagte, eine Festlegung, das eine Spalte (oder auch mehrere) eindeutig ist. Verwirrt wird dich wohl haben, das eben in der Regel automatisch bei Angabe eines Primary Key auch ein Index angelegt wird.
Dies ist aber nur 'Komfort' eines DB-Systems. Der Primary Key würde auch ohne Index eine Eindeutigkeit festlegen. Eindeutigkeit und Indexierung haben aber nichts miteinander zu tun. Die Indexierung dient nur der Performance, um eben schneller auf Datensätze zugreifen zu können.

Wenn du z.b eine Tabelle hast, in der mehrere Spalten stehen, auf der ersten einen Primary Key hast, aber oft nach der 3ten Spalte suchst, würde sich ein Index auf die 3te Spalte lohnen, da so der Zugriff darauf schneller erfolgen kann.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mi 20.05.09 11:40 
ok verstehe. warum macht man dann nicht auf jede spalte einen index?
Ramon
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 107

WIN7
D6 Prof, D7 Prof, D 2009
BeitragVerfasst: Mi 20.05.09 11:44 
user profile iconmoloch hat folgendes geschrieben Zum zitierten Posting springen:
ok verstehe. warum macht man dann nicht auf jede spalte einen index?


Naja, du darfst nicht vergessen, dass das immer Speicher weg nimmt. Irgendwo muss der Index ja abgelegt werden.
Außerdem muss das DBMS bei der Selektion entscheiden, welchen Index es am besten benutzt. Hast du zuviele, kann es passieren, dass es vielleicht einen anderen wählt, als du erwartest.