none
Voraussetzungen für 1:n Beziehung zwischen Tabellen in SQL Database RRS feed

  • Frage

  • Hallo,

    ich versuche über das Azure Verwaltungsportal eine 1:n Beziehung zwischen 2 Tabellen (Betriebe und Mitarbeiter) in einer Azure SQL Datenbank herzustellen. In der Tabelle 'Betriebe' habe ich ein Feld mit der Bezeichnung 'ID' (Integer, primary key), in der Tabelle 'Mitarbeiter' habe ich ein Feld mit der Bezeichnung 'Nr' (Integer). Ich lege nun mithilfe der grafischen Oberfläche des Portals für die Tabelle 'Betriebe' eine neue Fremdschlüsselbeziehung an, wähle dazu das ID Feld als Fremdschlüsselfeld, dann im Popup-Fenster die Verweistabelle 'Mitarbeiter', bekommen dann zur Auswahl für die Verweisspalte aber nur das Primärschlüsselfeld der Tabelle zur Auswahl angezeigt und nicht jenes Feld (Nr) über das ich die 1:n Beziehung herstellen möchte. Das Feld 'Nr' lässt sich nicht eingeben. Gibt es außer, dass die in Beziehung stehenden Felder gleicher Art sein müssen und das Schlüsselfeld in der Tabelle 'Betriebe' ein Primärschlüssel sein muss, noch andere Bedingungen, die ich übersehen habe?

    LG

    Manfred

    Donnerstag, 24. Oktober 2013 14:39

Antworten

  • Danke. Ich hab's herausgefunden. Eine 1:n Beziehung von Betriebe auf Mitarbeiter muss man auf der grafischen Oberfläche vom Azure Portal von der Mitarbeiter-Seite einrichten. Also in den Entwurf der 'Mitarbeiter' Tabelle gehen und dort vom Feld 'Nr' zur Tabelle 'Betriebe' aufs Feld 'ID' die Beziehung einrichten. Dann geht's.

    Danke jedenfalls für eure Tipps.

    LG

    Manfred

    Donnerstag, 24. Oktober 2013 18:21

Alle Antworten

  • In der Tabelle 'Betriebe' habe ich ein Feld mit der Bezeichnung 'ID' (Integer, primary key), in der Tabelle 'Mitarbeiter' habe ich ein Feld mit der Bezeichnung 'Nr' (Integer). Ich lege nun mithilfe der grafischen Oberfläche des Portals für die Tabelle 'Betriebe' eine neue Fremdschlüsselbeziehung an, wähle dazu das ID Feld als Fremdschlüsselfeld

    Hallo Manfred,

    ID ist doch der PrimaryKey von "Betriebe", dann solltest Du es auch als "Primärschlüsselfeld", "Nr" in "Mitarbeiter" ist dann das Fremdschlüsselfeld.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 24. Oktober 2013 14:51
  • Wenn ich hier im Text nichts verwechselt habe, sollte das alles sein.

    Die Oberfläche von Azure ist mir leider nicht so geläufig. Schon mal per ALTER TABLE versucht? Dann bekommt man bestimmt eine schöne, hilfreiche, Fehlermeldung.

    Ein Tipp noch: Wenn jemals jemand anderes diese Datenbank untersuchen/programmieren soll, würde derjenige sich bestimmt freuen, wenn Verweisspalten leicht zu erkennen sind.

    Also Nicht Nr -> ID

    Sondern vielleicht eher soetwas wie:

    ID_Betrieb -> ID_Betrieb

    nur ein Tipp..


    Andreas Wolter | Microsoft Certified Master SQL Server

    Blog: www.insidesql.org/blogs/andreaswolter
    Web: www.andreas-wolter.com | www.SarpedonQualityLab.com

    Donnerstag, 24. Oktober 2013 14:53
  • In der Tabelle 'Betriebe' habe ich ein Feld mit der Bezeichnung 'ID' (Integer, primary key), in der Tabelle 'Mitarbeiter' habe ich ein Feld mit der Bezeichnung 'Nr' (Integer). Ich lege nun mithilfe der grafischen Oberfläche des Portals für die Tabelle 'Betriebe' eine neue Fremdschlüsselbeziehung an, wähle dazu das ID Feld als Fremdschlüsselfeld

    Hallo Manfred,

    ID ist doch der PrimaryKey von "Betriebe", dann solltest Du es auch als "Primärschlüsselfeld", "Nr" in "Mitarbeiter" ist dann das Fremdschlüsselfeld.


    ...

    ich musste es auch dreimal lesen weil ich dachte irgendwas muss doch da vertauscht sein :-D
    Aber am Ende entschied ich, das ich es wohl falsch lese :-D

    Andreas Wolter | Microsoft Certified Master SQL Server

    Blog: www.insidesql.org/blogs/andreaswolter
    Web: www.andreas-wolter.com | www.SarpedonQualityLab.com

    Donnerstag, 24. Oktober 2013 15:35
  • Danke. Ich hab's herausgefunden. Eine 1:n Beziehung von Betriebe auf Mitarbeiter muss man auf der grafischen Oberfläche vom Azure Portal von der Mitarbeiter-Seite einrichten. Also in den Entwurf der 'Mitarbeiter' Tabelle gehen und dort vom Feld 'Nr' zur Tabelle 'Betriebe' aufs Feld 'ID' die Beziehung einrichten. Dann geht's.

    Danke jedenfalls für eure Tipps.

    LG

    Manfred

    Donnerstag, 24. Oktober 2013 18:21
  • Ja, danke für den Hinweis. Ist besser so.

    LG
    Manfred

    Donnerstag, 24. Oktober 2013 18:22
  • Hallo Manfred,

    schön, dass Du es heraus gefunden hast.

    Als Hinweis: Fremdschlüsseleinschränkungen werden immer auf der rechten (N)-Seite (Mitarbeiter) angelegt. Denn der Fremdschlüssel gehört logisch zu dieser Tabelle => würde sie gelöscht, gäbe es auch keinen Grund mehr für die Einschränkung, wohingegen die referenzierte Tabelle davon unberührt bleibt.

    In SQL ginge es im übrigen so:

    CREATE TABLE Betrieb ( 
    	BetriebID int NOT NULL,
    	CONSTRAINT PK_Betrieb PRIMARY KEY (BetriebID));
    
    CREATE TABLE Mitarbeiter ( 
    	MitarbeiterID int NOT NULL,
    	BetriebID int NOT NULL,
    	
    	CONSTRAINT PK_Mitarbeiter PRIMARY KEY (MitarbeiterID),
    	CONSTRAINT FK_Mitarbeiter_Betrieb
    		FOREIGN KEY (BetriebID)
    		REFERENCES Betrieb (BetriebID));

    bzw. im Nachhinein über ALTER TABLE:

    ALTER TABLE Mitarbeiter WITH CHECK 
    ADD CONSTRAINT FK_Mitarbeiter_Betrieb
    		FOREIGN KEY (BetriebID)
    		REFERENCES Betrieb(BetriebID);

    (und mit etwas Übung braucht es weniger Geklicke als im SSMS und vermutlich macht es Azure auch nicht anderes/besser ;)

    Gruß Elmar

    Donnerstag, 24. Oktober 2013 19:24
    Beantworter
  • Hallo Elmar,

    Danke für die Hilfe.

    Jetzt habe ich gleich noch eine Frage: Wie wird mit SQL festgelegt, ob Löschungen von Datensätzen in der Tabelle 'Betriebe' auch an die Tabelle 'Mitarbeiter' weitergegeben werden sollen bzw. nicht weitergegeben werden sollen?

    LG

    Manfred

    Freitag, 25. Oktober 2013 08:56
  • Hallo Manfred,

    Änderungs- und Löschweitergaben kannst Du über Optionen angeben, siehe ALTER TABLE (entsprechend auch bei CREATE TABLE), z. B.:

    ALTER TABLE Mitarbeiter WITH CHECK 
    ADD CONSTRAINT FK_Mitarbeiter_Betrieb
    	FOREIGN KEY (BetriebID)
    	REFERENCES Betrieb(BetriebID)
            ON UPDATE CASCADE
            ON DELETE CASCADE;

    richtet eine Änderungs- und Löschweitergabe ein. Standard ist NO ACTION, d.h. es wird ein Fehler erzeugt, wenn noch ein Mitarbeiter für den Betrieb existiert.

    Gruß Elmar
    Freitag, 25. Oktober 2013 09:45
    Beantworter