2016-06-07 2 views
0

нужна ваша помощьПроверка ограничений в Oracle SQL Developer

У меня есть таблица в Oracle SQL Developer этого рода:

 
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 

Это какой-то библиотеки книги выдачи где (нуль) в средство Возвращается колонки что эта книга еще не была возвращена. Мне нужно создать правило проверки, чтобы избежать выпуска книги, которая не была возвращена (например, я не могу взять книгу № 5 на данный момент). Как я могу это реализовать?

+0

Вы не можете. Не как ограничение. Вы можете создать функцию/процедуру для этого. Невозможно создать ограничение для проверки предыдущих строк. Будет ли функция служить вам? –

ответ

1

Хммм. Вы не можете сделать это с помощью ограничения check, поскольку они применяются только к значениям в одной строке.

Что вы хотите, так это то, что у вас нет двух возвращенных значений для книги. Некоторые базы данных поддерживают отфильтрованные уникальные индексы:

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

Но не Oracle. Вы можете сделать что-то очень похожее с индексом функции на основе:

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

Это будет иметь тот же эффект, позволяющий только один NULL стоимость одной книги.

0

Вы можете сделать это с:

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); 

Тогда:

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

будет завершаться:

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

Спасибо, но это решение не работает, потому что когда книга была возвращена, как только вы не сможете вернуть ее снова (пара (book_id, null) должна быть уникальной) – JGDger

Смежные вопросы