1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Referentielle Integrität mittels SQL Statement überprüfen?

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von hendrik, 27 Januar 2011.

  1. hendrik

    hendrik Neuer Benutzer

    Hallo zusammen,

    ich habe eine SEHR theoretische Frage, die aus einer alten Datenbank Klausur stammt, an der ich gerade tüftele. :confused:
    Die Frage lautet, wie sich mit einem SQL Befehl die Einhaltung der Referentiellen Integrität überprüfen lässt.

    Über einen Gedankeansatz wäre ich sehr dankbar, zumal ich noch ein Datenbank Neuling bin. Zum überprüfen und testen habe ich den SQL Server 2005 . Die vollständige Angabe zu der Aufgabe anbei.

    Vielen Dank,

    Gruß

    Hendrik
     

    Anhänge:

    • RI.JPG
      RI.JPG
      Dateigröße:
      31,5 KB
      Aufrufe:
      7
  2. Charly

    Charly Datenbank-Guru

    AW: Referentielle Integrität mittels SQL Statement überprüfen?

    Hallo hendrik,

    ich gehe mal dvon aus das die Tabellen noch leer sind.

    Dann versuch mal was in a_b einzufügen
    Code:
     insert into a_b values (1,1,1)
    
    Die INSERT-Anweisung steht in Konflikt mit der FOREIGN KEY-Einschrnkung "fk_a". Der Konflikt trat in der blabla-Datenbank, Tabelle "dbo.a", column 'abanr' auf.

    Gruß Charly
     
  3. hendrik

    hendrik Neuer Benutzer

    AW: Referentielle Integrität mittels SQL Statement überprüfen?

    Hallo,
    danke für die schnelle Antwort. Leider geht es aus der Ausgabenstellung nicht hervor, ob die Tabellen gefüllt sind, oder nicht.

    Müsste man bei gefüllten Tabellen nicht mit einem Join überprüfen können, on für jeden FS Wert auch wirklich ein PS Wert existiert? Vielleicht kann man ja auch mit einem IS NULL Statement arbeiten... :confused:

    Danke derweil, ich bastele mal weiter aber bisher bekomme ich so viele Syntax Fehler...
     
  4. Charly

    Charly Datenbank-Guru

    AW: Referentielle Integrität mittels SQL Statement überprüfen?

    Hallo hendrik,

    was hällst du hiervon:

    Code:
    SELECT distinct a_b.abnr,a.anr,b.bnr FROM a_b
    join a on a_b.abanr<>a.anr
    join b on a_b.abbnr<>b.bnr
    where a_b.abnr not in
    (SELECT a_b.abnr FROM a_b
    join a on a_b.abanr=a.anr
    join b on a_b.abbnr=b.bnr)
    AND a.anr not in(SELECT abanr FROM a_b)
    AND b.bnr not in(SELECT abbnr FROM a_b)
    Wenn alles OK ist dürfte die Abfrage keine Zeilen zurückgeben. Andernfalls werden Zeilen zurückgegeben.

    Gruß Charly
     
  5. hendrik

    hendrik Neuer Benutzer

    AW: Referentielle Integrität mittels SQL Statement überprüfen?

    Recht vielen Dank, ich werde es gleich mal testen...
     
  6. hendrik

    hendrik Neuer Benutzer

    AW: Referentielle Integrität mittels SQL Statement überprüfen?

    Einen Fehler habe ich damit nicht produziert. Ich habe die Tabellen gefüllt, und RI nachträglich aktiviert. Dabei fehlte in der Tabelle A_B eine Beziehung zu A. Daher hätte er meines Verständnisses nach einen Datensatz ausgeben müssen, hat er aber nicht.

    Trotzdem danke. Mich regen diese fingierten Fragestellungen echt auf. Ich könnte ja mal zur allgemeinen Belustigung ein paar Fragen online stellen...
     
  7. Charly

    Charly Datenbank-Guru

    AW: Referentielle Integrität mittels SQL Statement überprüfen?

    Hallo hendrik,

    ich habe in jeder Tabelle einen Datensatz gehabt der nicht in den anderen Tabelle gestanden hat.

    Zu wenig Tests durchgeführt:eek:

    [EDIT]

    So, jetzt hat mich der Ergeiz aber gepackt. Das muss doch gehen. Ich kann doch hier nicht Tagelang auf der Leitung stehen.


    Code:
     
    SELECT abnr AS TEST FROM a_b
    WHERE abnr NOT IN (SELECT a_b.abnr FROM a_b
     join a on a_b.abanr=a.anr
     join b on a_b.abbnr=b.bnr)
    UNION
    SELECT anr AS TEST FROM a
    WHERE anr NOT IN (SELECT a.anr FROM a_b
     join a on a_b.abanr=a.anr)
    UNION
    SELECT bnr AS TEST FROM b
    WHERE bnr NOT IN (SELECT b.bnr FROM a_b
     join b on a_b.abbnr=b.bnr)
    
    Das wars doch jetzt hoffentlich;)

    Gruß Charly
     

Diese Seite empfehlen