Как вы применяете условную ненулевую проверку по столбцам SQL - PullRequest
3 голосов
/ 15 января 2010
create table A (id, col_A, col_B, col_C)

id = уникальный идентификатор для каждой сохраняемой строки допустимым значением будет col_A или col_B, но оба столбца не будут иметь значения для каждой сохраняемой строки одновременно.

например.

insert into A (id, col_A, col_C) values (1, "a", "c")
insert into A (id, col_B, col_C) values (1, "b", "c")
insert into A (id, col_A, col_C) values (1, "aa", "cc")
insert into A (id, col_B, col_C) values (1, "bb", "cc")

примечание: col_A и col_B не могут быть объединены в один столбец согласно дизайну.

Я хотел бы включить условную проверку, не равную NULL, в col_A и col_B на основе вышеуказанного ограничения (то есть для каждой строки должно присутствовать по крайней мере col_A или col_B). Как мне этого добиться?

EDIT: 1. Мы хотели бы поддержать следующие базы данных, чтобы начать с H2, MySQL, Postgres 2. Мы также хотели бы выразить ограничения с помощью аннотаций JPA вместо конкретного синтаксиса базы данных. 3. Основным слоем ORM является Hibernate 3.3.x

Ответы [ 3 ]

5 голосов
/ 15 января 2010

Вам необходимо определить ограничение проверки уровня таблицы. Следующее использует синтаксис Oracle, но большинство продуктов СУБД будет иметь что-то очень похожее ....

alter table A add constraint a_or_b
    check (
        ( a is not null and b is null ) 
    or
        ( a is null and b is not null ) 
    )
/

редактировать

В ответ на ваш комментарий, я думаю, это будет

@org.hibernate.annotations.Check(

constraints = “(a is not null and b is null) or (a is null and b is not null)”

)

Но как модельер данных и администратор БД это действительно то, что я хотел бы применить в базе данных. Я не думаю, что синтаксис действительно будет сильно отличаться, если вообще зависит, от разных разновидностей RDBMS.

2 голосов
/ 15 января 2010

Вы можете использовать ограничение, которое проверяет, что col_a не равно нулю или col_b не равно нулю. Это даст вам ошибку, если оба столбца имеют значение NULL или оба столбца не имеют значение NULL. Он будет разрешать записи только с a или b.

В SQL Server будет выглядеть так:

ALTER TABLE [dbo].[A]  
WITH CHECK ADD  CONSTRAINT [CK_test] 
   CHECK  (([col_a] IS NOT NULL and [col_b] IS NULL)
        or ([col_a] IS NULL and [col_b] IS NOT NULL)
        )
0 голосов
/ 15 января 2010

Триггеры. Поскольку вы не указали, какая база данных, довольно сложно дать более подробный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...