Autor Beitrag
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 16:51 
user profile iconmoloch hat folgendes geschrieben Zum zitierten Posting springen:
also der key soll dazu kommen


Also dann reicht
ausblenden SQL-Anweisung
1:
ALTER TABLE StatusP ADD (PRIMARY KEY (Datum));					

nicht.

Du musst alle Primary Key Spalten mitnehmen:
ausblenden SQL-Anweisung
1:
ALTER TABLE StatusP ADD (PRIMARY KEY (AlterKeySpalte1,AlterKeySpalte2,Datum));					
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 16:53 
ok, wenn du deinen PK erweitern willst:

angenommen:

Alter key Nr,
neue spalte Datum
neuer Key (nr, Datum)

dann
1.) alten key droppen
drop constraint PK ...
2.) neue Spalte mit not null anlegen
alter table add ... not null;
3.) neue Spalte mit eindeutigen Daten füllen
update table set datum = einDatum
4.) neuen Key anlegen
alter table tablename add constraint table_Pk Primary key(nr, Datum);

müsste so klappen, ich mach nu erstmal feierabend, bin erst Freitag wieder online, also

happy Vatertag ;)

_________________
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 25.05.09 08:39 
hey entschuldigt war schon weg hoffe der vatertag wurde gut überstanden.
also ich versuche eure vorschläge gleich mal..
bis später
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Mo 25.05.09 15:39 
hallo,
also für oracle muss ich in der tat die variante von zuma verwenden. also der part der mir noch gefehlt hatte war der default wert für die neue spalte. darf bei oracle nicht null sein, sonst gibt es fehlermeldung beim versuch die primären anzulegen.
also dank euch alle für die hilfe.
beste grüße
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: Mo 25.05.09 16:18 
Ich denke mal, meine Variante ist für alle DB-Systeme gültig, mir ist jedenfalls noch keines untergekommen, das sich da anders verhält.
Es würde mich wundern, wenn es ein DB-System gibt, das einen Primärschlüssel mit Null-Werten (nicht 0-Werten!) zulässt.

_________________
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: Di 26.05.09 08:11 
also bei mssql und mysql habe ich den primary gelöscht und einfach wieder mit dem ergänzenden primärindex angelegt.


bei mssql lege ich so an:
ausblenden SQL-Anweisung
1:
CREATE UNIQUE INDEX prima ON Tabelle (spalte1, spalte2, spalte3)					


bei oracle und mysql so:
ausblenden SQL-Anweisung
1:
ALTER TABLE Tabelle ADD (PRIMARY KEY (spalte1, spalte2, spalte3))					



ist da evtl noch der hund begraben?
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 26.05.09 10:31 
also, beim ersten Beispiel hast du einen Index angelegt, beim 2ten Beispiel hast du einen Primary Key angelegt. Das ist, wie bereits oben erklärt, NICHT das gleiche!

_________________
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: Di 26.05.09 10:37 
den index den ich bei mssql angelegt habe ich aber unique und damit passiert doch das was auch bei einem primary passiert oder? also wenn ich versuche einen 2. satz anzulegen mit den gleichen inhalten auf den jeweiligen spalten (mssql -db) dann verweigert er den satz einzutragen. wie bei einem primärkey. wo liegt dann der grundlegende unterschied. ich dachte genau das soll ein primärkey machen. doppelte einträge verhindern
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 26.05.09 10:52 
Das ist schon sehr ähnlich.
Ein Index ist aber 'nur' ein Performancebeschleuniger beim Suchen.
Die Angabe Unique ist für die DB das Kennzeichen, bei einer Spalte auf Eindeutigkeit 'aufzupassen'. Deine Zeile enthält also 2 Befehle für die DB.
Ein Primary Key macht sozusagen beides in einem Befehl, d.h. es wird eine Eindeutigkeit erzwungen und gleichzeitig ein Index auf die Spalte(n) gelegt.

Ich hoffe, das das so verständlich ist, ist schwer, das mit einfachen Worten und trotzdem korrekt zu erklären.

_________________
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: Di 26.05.09 10:59 
hm ja ok. und wo ist das argument den primary zu nutzen wenn ich mit meiner sql das ergebnis erziele was ich auch haben wollte? also einen satz mit den selben auf den jeweiligen spalten- inhalten zu verhindern
oder kann ich es auch so machen?
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 26.05.09 12:30 
boah, wie soll ich dir das erklären ....
ich versuchs mal so:
den Primary key nutzt man in der Regel, um festzulegen, über welche(n) Wert(e) man auf einen Datensatz eindeutig zugreift. Unique Nutzt man, wenn man eine 2te Möglichkeit eines eindeutigen Zugriff's nutzen möchte.
z.B.
die Felder
Kd, Nr
bestimmen einen eindeutigen Datensatz in einer Tabelle, grundsätzlich wird auch über die beiden Felder abgefragt. (Also, Primary Key(KD, Nr) angelegt). Zusätzlich gibt es in der Tabelle ein Feld
LaufendeNr
das man z.b von einem DB-Generator belegen lässt. Dieses wird mit Unique angelegt und z.b zum verknüpfen der Tabelle mit abhängigen Tabellen genutzt.
Tabelle2 hat ein Feld ID (welches dort der PK ist), das referenziert auf Tabelle 1 Feld LaufendeNr. So kann man dann mit Hilfe von Foreign Key's die Integrität der Datenbankabhängigkeiten vom DB-System steuern lassen.

Ist sicher nicht vollkommen korrekt erklärt, aber besser weiss ich es dir im Moment nicht zu erklären.
Generell würde ich dir empfehlen, dich mal mehr mit dem Thema Datenbanken zu beschäftigen, ich kann sie zwar einigermaßen benutzen, aber zu 'Lehrerqualitäten' reichts wohl nicht so ganz ...

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


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 26.05.09 12:39 
Ich versuch mich auch mal an einer Erklärung :D

Wir haben oft den Fall, dass ein Kunde einen Datensatz mit einer Nummer identifizieren möchte. Z.B. um bei der Dateneingabe über die Nummer auf den Datensatz zugreifen zu können. Viele User lernen diese Nummern erstaunlich schnell auswendig, wenn sie sie öfters benötigen.
Diese Nummer möchte der Kunde aber später nochmal ändern können. Wenn er z.B. Datensäte in Nummernkreisen umorganisieren möchte, oder Ähnliches.

Nehmen wir eine Tabelle mit Kunden:
Spalten: ID, NR, NAME
Ich mache einen Primärindex auf das Feld ID. Damit identifiziere ich innerhalb meiner Anwendung den Datensatz. Die ID wird einmal beim Anlegen des Datensatzes vergeben und nie mehr geändert. Außerdem bekommt der User die ID niemals zu sehen. Und ich mache einen Unique-Index auf die Spalte NR. Damit kann der Kunde eine Kundennummer nur einmal vergeben. Er kann die NR nach Lust und Laune ändern (mit der Einschränkung, dass die NR eindeutig bleibt), ohne dass ich in anderen Tabelle außer der Kundentabelle etwas ändern müsste.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
moloch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 451

Win 2000
D5 Prof
BeitragVerfasst: Di 26.05.09 12:59 
dank euch,
ich denke jetzt hab ichs begriffen. werde auch noch mal versuchen was verständliches dazu zu finden.
danke auf jeden fall für die geduldige hilfe
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 26.05.09 13:05 
Zudem beschleunigen Indizes zwar die Selektionen, verlangsamen aber DML-Abfragen ( Insert, Update, Delete). Da die Änderungen in den jeweiligen Indizes mit angepasst werden müssen.

_________________
Markus Kinzler.