строки, которые исключают друг друга в операторе создания таблицы - PullRequest
3 голосов
/ 30 апреля 2011

Мне нужно создать таблицу с именем или фамилией человека или названием организации.Там должен быть точно один из них.Например, одна строка таблицы -

first_name  last_name  organization
----------  ---------  ------------
John        Smith      null

или другая строка -

first_name  last_name  organization
----------  ---------  --------------------
null        null       HappyStrawberry inc.

Есть ли способ определить это на языке SQL?Или я должен просто определить все три столбца, чтобы получить нулевые значения?

Ответы [ 3 ]

2 голосов
/ 01 мая 2011

Ваша ситуация является классическим примером того, что некоторые диалекты ER называют «подтипом сущности».

У вас есть сущность под названием «Персона» (или «Сторона» или что-то в этом роде), и у вас есть дваПодразделения ditinct, называемые NaturalPerson и LegalPerson, соответственно.

Канонический способ моделирования подтипов сущностей ER в реляционной базе данных - использование трех таблиц: одна для сущности «Person» со всеми столбцами, которые являются«общий» как для NaturalPerson, так и для LegalPerson (т. е. существуют для лиц независимо от их типа) и один для каждого идентифицированного подобъекта, в котором содержатся все столбцы, относящиеся, в частности, к этому подобъекту.

Можноподробнее об этом читайте в книге Фабиана Паскаля «Практические вопросы управления базами данных».

0 голосов
/ 30 апреля 2011

Вы можете сделать это, используя ограничение :

CREATE TABLE [dbo].[Contact](
    [first_name] [varchar](50) NULL,
    [last_name] [varchar](50) NULL,
    [organization] [varchar](50) NULL,
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Contact]  WITH CHECK ADD  CONSTRAINT [CK_Contact] CHECK  (([first_name] IS NOT NULL OR [last_name] IS NOT NULL OR [organization] IS NOT NULL))
GO

ALTER TABLE [dbo].[Contact] CHECK CONSTRAINT [CK_Contact]
GO

Ограничение CK_Contact гарантирует, что было введено хотя бы одно значение.

0 голосов
/ 30 апреля 2011

Вы можете использовать проверочное ограничение, например:

create table YourTable (
    col1 varchar(50)
,   col2 varchar(50)
,   col3 varchar(50)
,   constraint TheConstraint check ( 1 =
        case when col1 is null then 1 else 0 end +
        case when col2 is null then 1 else 0 end +
        case when col3 is null then 1 else 0 end )
)

Другой способ - добавить столбец type (метод EAV):

create table YourTable (
    type varchar(10) check (type in ('FirstName', 'LastName', 'Organisztion')
,   value varchar(50))
insert YourTable ('LastName', 'Obama')
insert YourTable ('FirstName', 'Barrack')
insert YourTable ('Orginazation', 'White House')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...