Autor |
Beitrag |
Ramon
      
Beiträge: 107
WIN7
D6 Prof, D7 Prof, D 2009
|
Verfasst: Mi 20.05.09 16:51
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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:
SQL-Anweisung 1:
| CREATE UNIQUE INDEX prima ON Tabelle (spalte1, spalte2, spalte3) |
bei oracle und mysql so:
SQL-Anweisung 1:
| ALTER TABLE Tabelle ADD (PRIMARY KEY (spalte1, spalte2, spalte3)) |
ist da evtl noch der hund begraben?
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Di 26.05.09 12:39
Ich versuch mich auch mal an einer Erklärung
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 
      
Beiträge: 451
Win 2000
D5 Prof
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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.
|
|