2016-06-07 22 views
0

brauchen Ihre Hilfeüberprüfen Constraint in Oracle SQL Developer

Ich habe eine Tabelle in SQL Developer dieser Art:

 
Issue 
ID|Subscriber_ID|Book_ID| Taken |Returned 
--+-------------+-------+--------+-------- 
1 | 1   | 2 |01-06-16|05-06-16 
2 | 3   | 5 |07-05-16| (null) 
3 | 2   | 2 |06-06-16| (null) 
4 | 1   | 3 |17-05-16|26-05-16 

Es ist eine Art Bibliothek Buch ausstellende wo (null) in Returned Spaltenmittel dass dieses Buch noch nicht zurückgegeben wurde. Ich muss eine Validierungsregel erstellen, um die Ausgabe von Büchern zu vermeiden, die nicht zurückgegeben wurden (z. B. kann ich das Buch Nr. 5 im Moment nicht nehmen). Wie kann ich es implementieren?

+0

Sie können nicht. Nicht als Einschränkung. Sie können dazu eine Funktion/Prozedur anlegen. Eine Einschränkung kann nicht erstellt werden, um vorherige Zeilen zu überprüfen. Würde eine Funktion Ihnen dienen? –

Antwort

1

Hmmm. Sie können dies nicht mit einer check-Einschränkung tun, da diese nur für Werte in einer Zeile gilt.

Sie möchten sicherstellen, dass Sie nicht zwei zurückgegebene Werte für ein Buch haben. Einige Datenbanken unterstützen gefilterte eindeutige Indizes:

create unique index on unq_issue_bookid on issue(book_id) where returned is null; 

Aber nicht Oracle. Sie können mit einer funktionsbasierten Index etwas sehr ähnliches tun:

create unique index on unq_issue_bookid_returned 
    on issue(book_id, 
      (case when returned is not null then id else -1 end) 
      ); 

Dies wird die gleiche Wirkung, daß nur ein NULL Wert pro Buch.

0

Sie können es mit:

CREATE TABLE table_name (ID, Subscriber_ID, Book_ID, Taken, Returned) AS 
SELECT 1, 1, 2, DATE '2016-06-01', DATE '2016-06-05' FROM DUAL UNION ALL 
SELECT 2, 3, 5, DATE '2016-05-07', NULL FROM DUAL UNION ALL 
SELECT 3, 2, 2, DATE '2016-06-06', NULL FROM DUAL UNION ALL 
SELECT 4, 1, 3, DATE '2016-05-17', DATE '2016-05-26' FROM DUAL; 

ALTER TABLE table_name ADD is_borrowed 
    GENERATED ALWAYS AS (CASE WHEN returned IS NULL THEN 1 END) VIRTUAL; 

ALTER TABLE TABLE_NAME ADD CONSTRAINT is_borrowed__u 
    UNIQUE(book_id, is_borrowed); 

Dann:

INSERT INTO table_name (ID, Subscriber_ID, Book_ID, Taken) 
VALUES (5, 2, 5, DATE '2016-06-06'); 

fehl mit:

SQL Error: ORA-00001: unique constraint (TEST.IS_BORROWED__U) violated 
+0

Danke, aber diese Lösung funktioniert nicht, denn wenn das Buch einmal zurückgegeben wurde, kann es nicht mehr zurückgegeben werden (pair (book_id, null) muss ebenfalls eindeutig sein) – JGDger