2015-05-05 2 views
12

Ich habe diese Beziehung. Und ich habe vorübergehend zerstören es nur die Größe von „Salid“ Feld Befehl SQL zu ändern:Zugriff auf SQL zum Erstellen einer Eins-zu-viele-Beziehung ohne referenzielle Integrität erzwingen

ALTER TABLE Adressen DROP CONSTRAINT [ChildTableMainTable] 

I need to restore this original relation

Wie kann ich die gleiche Beziehung Typ mit SQL-Befehlen neu erstellen? Wenn ich die nächste SQL verwende, bekomme ich eine Eins-zu-viele-Beziehung. Dies ist nicht das, was ich brauche:

ALTER TABLE MainTable ADD CONSTRAINT [ChildTableMainTable] FOREIGN KEY (salID) REFERENCES [ChildTable] (ChildPK); 

I dont need Enforce Referential Integrity

+0

Ich denke, beide Relationen sind 1-zu-viele-Beziehungen, wie in der Edit-Relations-Box im unteren angezeigt ... was Sie suchen, ist am Ende 'ON UPDATE SET NULL ON DELETE SET NULL' anhängen? – luk2302

+0

Die referenzielle Integrität wurde in meiner ursprünglichen Beziehung nicht überprüft. Nach verschiedenen Ansätzen gab ich auf. – profimedica

+0

Wenn Sie wollen eine Beziehung zwischen diesen Tabellen ohne referentielle Integrität, kann ich nichts anderes als Join auf salID und CliIDPK denken, –

Antwort

9

Nach bestem Wissen und Gewissen, Zugang DDL einfach nicht die Schaffung eines Access „Relationship“ unterstützt ohne „referentielle Integrität“. CREATE CONSTRAINT erstellt eine Beziehung mit "referenzielle Integrität erzwingen", denn genau das ist eine solche Beziehung: eine referenzielle Integrität Einschränkung.

(Die ON UPDATE und ON DELETE Klauseln CREATE CONSTRAINT Steuerung der Werte der „Cascade Update-verwandten Gebiete“ und „Cascade Delete Related Records“ Kontrollkästchen in den Beziehungen bearbeiten Dialog, aber sie haben keine Kontrolle über den Wert der „referentielle Integrität "Kontrollkästchen selbst."

Mit anderen Worten, eine Beziehung ohne "referenzielle Integrität erzwingen" ist überhaupt keine Einschränkung. Es ist lediglich ein "Hinweis", dass die Tabellen über die angegebenen Felder in Beziehung stehen, z. B. so, dass der Abfrage-Generator automatisch den Tabellen beitreten kann, wenn sie dem Abfrageentwurf hinzugefügt werden.

Um eine Beziehung ohne "referenzielle Integrität erzwingen" zu erstellen, müssen Sie Access DAO verwenden. Für eine Beziehung wie diese

EditRelationships.png

den erforderlichen Code in VBA würde

Option Compare Database 
Option Explicit 

Public Sub CreateRelationship(relationshipName As String, _ 
     parentTableName As String, childTableName As String, _ 
     parentTablePkName As String, childTableFkName As String) 
    Dim cdb As DAO.Database 
    Set cdb = CurrentDb 
    Dim rel As DAO.Relation 
    Set rel = cdb.CreateRelation(relationshipName, parentTableName, _ 
      childTableName, dbRelationDontEnforce) 
    rel.Fields.Append rel.CreateField(parentTablePkName) ' parent PK 
    rel.Fields(parentTablePkName).ForeignName = childTableFkName ' child FK 
    cdb.Relations.Append rel 
    Set rel = Nothing 
    Set cdb = Nothing 
End Sub 
1

Zum einen sein, Ihre "Cihld" (hat jemand wirklich Kind falsch schreiben, die schlecht und es im Schema lassen ?? ?) Tabelle ist eigentlich die übergeordnete Tabelle, und die Haupttabelle ist die untergeordnete Tabelle, entsprechend der Beziehung wie definiert: Die untergeordnete Tabelle hat die Fremdschlüsselspalte eingeschränkt, Primärschlüsselwerte aus der übergeordneten Tabelle zu haben. Dieses Verwechseln und die Rechtschreibfehler deuten stark auf ein Durcheinander hin.

Dennoch ist es für die Fremdschlüsselspalte zulässig als nullable definiert werden (dh tun nicht sie mit dem NOT NULL Modifier definieren). Tun Sie dies, und legen Sie die Fremdschlüsselspalte auf NULL fest, egal, welche Zeilen Sie nicht auf die übergeordnete Tabelle beschränken möchten.

Verwandte Themen