nicht mit referentieller Integrität in Access
Ich hab alles überprüft auf Fehler: Primärschlüssel, Eindeutigkeit und Typ. Zugang einfach nicht scheinen, um in der Lage sein link die 2 Felder in meiner Datenbank. kann jemand bitte schauen?
http://www.jpegtown.com/pictures/jf5WKxKRqehz.jpg
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Beziehung Diagramm zeigt, dass Sie gemacht haben die ID-Felder-Primärschlüssel in der alle Ihre Tabellen, aber Sie sind nicht mit Ihnen für Ihre Verknüpfungen. Sie dienen daher absolut keinen Sinn. Wenn du nicht gehst, zu verwenden "surrogate keys" (d.h., eine sinnlose ID-Nummer, die von der Datenbank generiert und ist eindeutig für jeden Datensatz, aber hat absolut keine Bedeutung in Bezug auf die Daten in deiner Tabelle), dann zu beseitigen. Aber wenn du gehst zu verwenden "natürlichen Schlüssel" (d.h., eine primary key-gebaut aus einem set von echten Daten-Felder, die zusammen gehen, um die einzigartig für jeden Datensatz), müssen Sie einen eindeutigen zusammengesetzten index auf die Felder.
Allerdings gibt es Probleme mit der beide Ansätze:
Ersatzschlüssel: ein Surrogat PK macht jeden Datensatz eindeutig. Das ist Sie haben könnten ein Rekord für David Fenton mit der ID 1 und einen Datensatz für David Fenton mit der ID 2. Wenn es der gleiche David Fenton, du hast doppelte Daten, sondern so weit wie Ihre Datenbank weiß, Sie sind einzigartig.
Natürliche Schlüssel: einige Arten von Entitäten arbeiten sehr gut mit natürlichen Schlüsseln. Das beste sind wo gibt es ein einziges Feld, das identifiziert den Datensatz eindeutig. Ein Beispiel wäre "Mitarbeiter geben," wo Werte vielleicht "associate, manager, etc." In diesem Fall ist es ein sehr guter Kandidat für die Nutzung der natürlichen Taste anstelle der Zugabe eines Surrogat-Taste. Das einzige argument gegen die natürlichen Schlüssel in diesem Fall wird, wenn die Daten in den Kandidatenländern natürlicher Schlüssel ist leicht flüchtig (D. H., es ändert sich Häufig). Während jede moderne Datenbank-engine bietet "CASCADE UPDATE" - Funktionalität (d.h., wenn der Wert in der PK-Feld ändert sich, alle Tabellen, in denen dieses Feld ist ein Fremdschlüssel werden automatisch aktualisiert), dies stellt einen gewissen Aufwand und kann problematisch sein. Für single-Spalte-Tasten, es wird kaum ein Problem sein. Nun, außer für lookup-Tabellen, es gibt sehr wenige Personen, für die eine Natürliche Schlüssel wird eine einzelne Spalte. Stattdessen müssen Sie zum erstellen eines zusammengesetzten index, d.h. ein index, der über mehrere Datenfelder. Im index-dialog in Access-Tabelle design, erstellen Sie einen zusammengesetzten Schlüssel, indem Sie ihm einen Namen in der ersten Spalte, und dann das hinzufügen mehrerer Zeilen in der zweiten Spalte (aus der dropdown-Liste Felder in der Tabelle). Der Nachteil dieser ist, dass wenn eines der Felder in Ihrer zusammengesetzten eindeutigen index unbekannt sind, werden Sie nicht Holen Sie sich Einzigartigkeit. Das heißt, wenn ein Feld einen Null-Wert in zwei Datensätze, die restlichen Felder sind identisch, dies wird nicht gezählt, als ein Konflikt der Einzigartigkeit, denn Null ist niemals gleich Null. Dies ist, weil Null bedeutet nicht "leer" - es bedeutet "Unbekannt".
Allen Browne erklärt hat, alles, was Sie wissen müssen über die Null-Werte:
In der Grafik, zeigen Sie, dass Sie versuchen, verknüpfen Sie die Tabelle Firma mit der PManager Tabelle. Die letztere Tabelle hat ein Feld CompanyID und Ihr Unternehmen-Tabelle hat einen eindeutigen index auf einem ID-Feld, also alles, was Sie brauchen, ist ein link aus dem ID-Feld der Tabelle Unternehmen, um die CompanyID-Feld der PManager Tabelle. Für dein Beispiel funktioniert (das wäre sinnlos, da du bereits einen eindeutigen index auf das Feld "ID"), würden Sie brauchen, um einen eindeutigen zusammengesetzten Schlüssel spanning beide ShortName-ID und in der Tabelle Unternehmen.
Darüber hinaus, wenn ShortName ist ein Feld, das Sie wollen, einzigartig zu sein (d.h., Sie wollen nicht zwei Unternehmen, Datensätze haben die gleiche ShortName), sollten Sie einen eindeutigen index haben, ob oder nicht Sie trotzdem verwenden Sie das ID-Feld als Primärschlüssel. Das bringt mich wieder zu Punkt 1 oben, wo ich beschrieben eine situation, wo ein Ersatzschlüssel führen könnte, die Sie zur Eingabe doppelte Datensätze, da die Eindeutigkeit wird durch die Surrogat-Schlüssel zusammen. Jedes mal, wenn Sie wählen, um einen Ersatzschlüssel, müssen Sie auch einen eindeutigen zusammengesetzten index auf eine beliebige Kombination von Daten-Felder, die eindeutig sein muss (mit dem VORBEHALT, über die Null-Felder, wie beschrieben im Punkt #2).
Wenn Sie jetzt denken, "surrogate keys bedeuten, mehr Indizes" Sie sind richtig, dass Sie zwei eindeutige Indizes auf derselben Tabelle (vorausgesetzt, Sie haben nicht die Null-problem). Aber Sie bekommen erhebliche Benutzerfreundlichkeit, verknüpfen von Tabellen in SQL, als auch als wesentlich weniger Duplizierung von Daten. Ebenso vermeiden Sie den Aufwand der UPDATE CASCADE. Auf der anderen Seite, wenn Sie eine child-Tabelle mit einer natürlichen foreign key, brauchen Sie nicht, sich an der übergeordneten Tabelle in der Lage sein zu identifizieren, die den übergeordneten Datensatz, da die Daten, die zur Identifizierung des Datensatzes ist es, direkt in das foreign-key-Felder. Das fehlen einer Notwendigkeit für eine Verknüpfung kann ein großer performance-Gewinn, in bestimmten Szenarien (insbesondere für den Fall, müssten Sie einen outer-join, da der Fremdschlüssel kann Null sein).
Dies ist eigentlich ganz ein großes Thema, und es ist so etwas wie ein religiöses argument. Ich bin fest in der Ersatzschlüssel-Lager, aber ich verwenden Sie die natürlichen Schlüssel für lookup-Tabellen, in denen der Schlüssel besteht aus einer einzigen Spalte. Ich glaube nicht, verwenden Sie die natürlichen Schlüssel für einen anderen Zweck. Das heißt, wo immer möglich (d.h. keine Null-Probleme) ich habe auch einen eindeutigen index auf die Natürliche Schlüssel.
Hoffe, das hilft.
Eigentlich brauchst du einen index auf die Namen von Feldern, auf beiden Seiten
Allerdings darf ich vorschlagen, dass Sie viel zu viele joins? Im Allgemeinen sollte es nur eine Verknüpfung von einer Tabelle zur nächsten Tabelle. Es ist selten mehr als einen join zwischen Tabellen, und äußerst selten mehr als zwei.
Haben Sie einen Blick auf diesen link:
http://weblogs.asp.net/scottgu/archive/2006/07/12/Tip_2F00_Trick_3A00_-Online-Database-Schema-Samples-Library.aspx
Bemerken, wie sich alle Tabellen sind miteinander durch eine einzige Beziehung?
Einzelnen Felder beschriftet PK-Primärschlüssel sind. Dies sind die AUTOWERT-Felder. Die einzelnen Felder beschriftet FK sind Fremdschlüssel. Diese index-Zahl-Felder vom Typ Integer. Die Primärschlüssel sind mit dem Fremdschlüssel in einer 1-zu-viele-Beziehung (in den meisten Fällen).
99% der Zeit, die Sie nicht brauchen, jede andere Art von Verknüpfungen. Der trick ist, um Tabellen zu erstellen mit eindeutigen Informationen. Es gibt eine Menge von wiederholten Informationen in Ihrer Datenbank.
Datenbank wird reorganisiert, die in dieser Weise nennt man eine "normalisierte" Datenbank. Es gibt viele gute Beispiele für diese http://www.databaseanswers.org/data_models/
Komm einfach auf die CompanyID. Man könnte auch loswerden das Feld Firma in PManager.
Habe ich Folgendes und das problem wurde gelöst (ich habe das gleiche problem referentieller Integrität in access).
Ich die exportierten Daten aus beiden Tabellen in Access zu Excel. Tabelle1
war mit Cust-Code und grundlegende Informationen über das Unternehmen.
Cust-Code als Primärschlüssel.
Tabelle2 war mit allen Informationen über den
Kunden, die dieser Firma zugewiesen.
Ich entfernt alle Duplikate in Tabelle2 in excel exportiert werden.
Mit SVERWEIS habe ich überprüft und festgestellt, dass es 11
Kunden-code nicht in "Tabelle1".
Fügte ich diese codes in Access-Tabelle. Ich verbunden
referenzielle Integrität und das Problem war gelöst.
Auch für den Fremdschlüssel, wenn es nicht funktioniert.
Müssen Sie einen INDEX erstellen. Vielleicht suchen Sie für eine Art von create index-Schaltfläche, und erstellen Sie einen index auf CompanyID