Autor |
Beitrag |
moloch
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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:
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 Christian S.: Delphi- durch SQL-Tags ersetzt
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mo 18.05.09 10:02
also ich habe mich entschlossen die Indizes zu löschen und dann anzulegen.
mit dieser sql funktioniert es:
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 Christian S.: Delphi- durch SQL-Tags ersetzt
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mo 18.05.09 11:46
IIRC?? kenne ich nicht.
mach doch bitte mal eine beispiel sql
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
      
Beiträge: 107
WIN7
D6 Prof, D7 Prof, D 2009
|
Verfasst: Mo 18.05.09 12:03
moloch hat folgendes geschrieben : |
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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mo 18.05.09 12:15
mssql
@benb ja das habe ich probiert. bei mssql funktioniert es nicht
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
      
Beiträge: 107
WIN7
D6 Prof, D7 Prof, D 2009
|
Verfasst: Mo 18.05.09 12:27
|
|
moloch 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mo 18.05.09 13:16
hab was besseres gefunden
EXEC sp_helpindex "tabelle"
funktioniert super bei mssql zumindest
|
|
moloch 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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:
SQL-Anweisung 1: 2: 3:
| drop index Indexname //oder ALTER TABLE Tabellenname DROP CONSTRAINT Constraintname |
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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 !!!!
Delphi-Quelltext
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
      
Beiträge: 107
WIN7
D6 Prof, D7 Prof, D 2009
|
Verfasst: Mi 20.05.09 10:51
|
|
moloch 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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
      
Beiträge: 107
WIN7
D6 Prof, D7 Prof, D 2009
|
Verfasst: 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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 20.05.09 11:28
[quote="] moloch
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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: Mi 20.05.09 11:40
ok verstehe. warum macht man dann nicht auf jede spalte einen index?
|
|
Ramon
      
Beiträge: 107
WIN7
D6 Prof, D7 Prof, D 2009
|
Verfasst: Mi 20.05.09 11:44
moloch hat folgendes geschrieben : | 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.
|
|