2010-04-11 5 views
6

Ich versuche, eine CHECK-Einschränkung in einer Oracle-Datenbank auf mehrere TabellenOracle Database Erzwingen CHECK an mehreren Tischen

... zu erzwingen, aber ich erhalte den folgenden Fehler:

*Cause: Subquery is not allowed here in the statement. *Action: Remove the subquery from the statement.

Can Sie helfen mir zu verstehen, was das Problem ist oder wie man dasselbe Ergebnis erzielt?

Antwort

2

Überprüfen Einschränkungen sind in Oracle sehr begrenzt. Um eine Prüfung wie die von Ihnen vorgeschlagene durchzuführen, müssen Sie eine PL/SQL trigger implementieren.

Mein Ratschlag wäre, Trigger insgesamt zu vermeiden. Implementieren Sie eine gespeicherte Prozedur, die die Datenbank ändert und die Überprüfungen einbezieht. Gespeicherte Prozeduren sind einfacher zu verwalten, obwohl sie etwas schwieriger zu implementieren sind. Aber das Ändern eines Front-Ends vom direkten Tabellenzugriff zum Zugriff auf gespeicherte Prozeduren zahlt sich auf lange Sicht oft aus.

2

Sie versuchen, sicherzustellen, dass die in einer Tabelle eingefügten Werte in einer anderen Tabelle vorhanden sind, d. H. Einen Fremdschlüssel erzwingen. So wäre das:

CREATE TABLE RollingStocks ( 
... 

    CONSTRAINT Pk_RollingStocks Primary Key (Id), 
    CONSTRAINT RollingStocks_CategoryId_FK (RollingStockCategoryId) 
    REFERENCES FreightWagonTypes (ID)  
); 

Abgesehen davon, dass Sie einen Fremdschlüssel erzwingen möchten, die zwei Tabellen verweist. Dies kann nicht getan werden.

Sie haben ein paar Optionen. Eine wäre es, FreightWagonTypes und LocomotiveClasses in einer einzigen Tabelle zusammenzufassen. Wenn Sie für andere Teile Ihrer Anwendung separate Tabellen benötigen, können Sie eine materialisierte Ansicht zum Erzwingen des Fremdschlüssels erstellen. Materialisierte Ansichten sind wie Tabellen und können durch Fremdschlüssel referenziert werden. Diese Option wird nicht funktionieren, wenn die Schlüsselwerte für die zwei Tabellen kollidieren. Eine andere Option besteht darin, zu erkennen, dass das Vorhandensein von zwei in Frage kommenden referenzierten Tabellen suggeriert, dass RollingStock möglicherweise in zwei Tabellen aufgeteilt werden muss - oder vielleicht drei: ein Supertyp und zwei Untertyptabellen, nämlich RollingStock und FreightWagons, Locomotives .

Übrigens, was ist mit PassengerCoaches, GuardsWagons und RestaurantCars?

+2

Eine weitere Alternative besteht darin, RollingStockCategoryId in zwei Spalten mit NULL-Wert aufzuteilen, eine als FK für FreightWagonTypes und die andere als FK für LocomotiveClasses. Sie können eine Prüfbedingung hinzufügen, um zu sagen, dass eine (und nur eine) für jede Zeile nicht null sein darf. –

0

Oracle unterstützt solche komplexen Prüfbedingungen leider nicht.

In diesem Fall ist es am besten, das Datenmodell ein wenig zu ändern - fügen Sie eine übergeordnete Tabelle über FreightWagonTypes und LocomotiveClasses hinzu, die alle IDs aus diesen beiden Tabellen enthält. Auf diese Weise können Sie einer einzelnen Tabelle einen FK hinzufügen.

Verwandte Themen