Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть.
Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?
17 янв 12, 21:12    [11921256]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Glory
Member

Откуда:
Сообщений: 104751
Darooma
Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?

Вы не поверите, но в дочернем поле по стандарту как раз может быть или NULL или значение из родительского поля.
17 янв 12, 21:21    [11921285]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
Glory
Darooma
Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?

Вы не поверите, но в дочернем поле по стандарту как раз может быть или NULL или значение из родительского поля.

Покажи на примере, непонятно.
17 янв 12, 22:28    [11921492]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
CREATE TABLE [dbo].[Customer] (
	 [ID]		Int	Identity
	 CONSTRAINT [PK_Customer]	PRIMARY KEY
	,[FirstName]	NVarChar(150)	NOT NULL
	,[LastName]	NVarChar(150)	NOT NULL
	,[MiddleName]	NVarChar(150)	    NULL
	,[Sex]		Bit		    NULL	-- Пропускаем женщин вперёт - 0, а потом идут мужики - 1
)							-- всё на своих местах, хотя не политкорректно
GO
CREATE TABLE [dbo].[User] (
	 [ID]		Int	Identity
	 CONSTRAINT [PK_User]	PRIMARY KEY
	,[Login]	SysName
	,[Customer]	Int		    NULL
	 CONSTRAINT [FK_User_Customer]	REFERENCES [dbo].[Customer] ([ID])
	,[PassWord]	VarBinary(128)	NOT NULL
)
GO
INSERT	dbo.Customer	(FirstName,LastName)
VALUES			('Иван'   ,'Пётр')

PRINT Scope_Identity()	-- 1
GO
INSERT	dbo.[User]	([Login],[PassWord])
VALUES			('sa'   ,0x676F64)

INSERT	dbo.[User]	([Login],[PassWord],Customer)
VALUES			('PetrI',0x5049    ,1)
PRINT Scope_Identity()	-- 2
GO
SELECT	*
FROM	dbo.Customer

SELECT	*
FROM	dbo.[User]

SELECT	*
FROM	     dbo.[User]		U
	JOIN dbo.Customer	C ON C.ID = U.Customer
GO
IDLoginCustomerPassWordIDFirstNameLastNameMiddleNameSex
1saNULL0x676F64NULLNULLNULLNULLNULL
2PetrI10x50491ИванПетрNULLNULL
18 янв 12, 00:35    [11921812]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Darooma
У пользователя может быть только один customer, а может вообще не быть.

Повесить триггер, разрулить там.
18 янв 12, 00:46    [11921833]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
Mnior,

это связь один-ко-многим, а мне нужна один-к-одному
18 янв 12, 06:24    [11922197]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
kDnZP
Darooma
У пользователя может быть только один customer, а может вообще не быть.

Повесить триггер, разрулить там.

поясни подробнее
18 янв 12, 06:25    [11922198]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
dymka
Member

Откуда: г. Альметьевск (Татарстан)
Сообщений: 235
Darooma
Mnior,

это связь один-ко-многим, а мне нужна один-к-одному


Сделайте поле Users.Customer уникальным для непустых значений.

ЗЫ: это вроде не связь один-к-одному, а один-к-0..1.
18 янв 12, 07:33    [11922310]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Darooma,

Добавь к тому что предложил Mnior Уникальный индекс с фильтром, если версия сервера позволяет, иначе тригер.
18 янв 12, 07:35    [11922316]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
dymka
Darooma
Mnior,

это связь один-ко-многим, а мне нужна один-к-одному


Сделайте поле Users.Customer уникальным для непустых значений.

Это как?

dymka
Darooma
Mnior,

это связь один-ко-многим, а мне нужна один-к-одному


ЗЫ: это вроде не связь один-к-одному, а один-к-0..1.

Она так называется?
18 янв 12, 08:33    [11922431]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
Guf,
покажи, пожалуйста, на примере.
18 янв 12, 08:34    [11922434]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Darooma,

Я же ссылку дал, там пример "И. Создание отфильтрованного индекса". Не достаточно?
18 янв 12, 08:42    [11922463]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Guf
Darooma,

Я же ссылку дал, там пример "И. Создание отфильтрованного индекса". Не достаточно?


С единственным дополнением, что индекс должен быть уникальным, CREATE UNIQUE NONCLUSTERED INDEX...
18 янв 12, 08:44    [11922474]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
dymka
Member

Откуда: г. Альметьевск (Татарстан)
Сообщений: 235
Вы справку принципиально не читаете?

CREATE UNIQUE INDEX <YourIndexName>
    ON dbo.Users (Customer)
    WHERE Customer IS NOT NULL


Насчет второго: ну вы же сами сказали, что запись в Customer может отсутствовать, значит допускаете мощность = 0.
Один-к-одному это строгий ключ. Не уверен, что он реализуем без костылей в MSSQL.
18 янв 12, 08:54    [11922500]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
Можно ли сделать, чтобы ключ был уникальным и в то же время допускал несколько значений NULL и имел связь один-к-одному?
18 янв 12, 15:17    [11926022]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
Darooma
Можно ли сделать, чтобы ключ был уникальным и в то же время допускал несколько значений NULL и имел связь один-к-одному?
Да, уже несколько раз написали.

Только не ключ, а индекс.
18 янв 12, 15:41    [11926328]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
dymka
Вы справку принципиально не читаете?

CREATE UNIQUE INDEX <YourIndexName>
    ON dbo.Users (Customer)
    WHERE Customer IS NOT NULL


Насчет второго: ну вы же сами сказали, что запись в Customer может отсутствовать, значит допускаете мощность = 0.
Один-к-одному это строгий ключ. Не уверен, что он реализуем без костылей в MSSQL.
19 янв 12, 06:40    [11929775]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Darooma
Member

Откуда:
Сообщений: 758
Всем спасибо.
19 янв 12, 06:42    [11929777]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
dymka

CREATE UNIQUE INDEX <YourIndexName>
    ON dbo.Users (Customer)
    WHERE Customer IS NOT NULL




А это для каких версий справедливо? У меня в 2005 SP2 не работает
19 янв 12, 12:52    [11931716]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Oblom
dymka
CREATE UNIQUE INDEX <YourIndexName>
    ON dbo.Users (Customer)
    WHERE Customer IS NOT NULL




А это для каких версий справедливо? У меня в 2005 SP2 не работает
Только для >=10
19 янв 12, 12:54    [11931737]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
Oblom,

2008 и выше, Вам сюда
19 янв 12, 12:54    [11931738]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Guf
Oblom,

2008 и выше, Вам сюда


С триггером понятно, хочется такого красивого решения :)
19 янв 12, 13:01    [11931809]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Oblom
С триггером понятно, хочется такого красивого решения :)
use tempdb;
go
create table dbo.Test
(
 usr_id int not null primary key,
 customer_id int null,
 dummy1 as case when customer_id is null then usr_id else 1 end
);
go
create unique index IX_Test__customer on dbo.Test(customer_id, dummy1);
go
insert into dbo.Test
 (usr_id, customer_id)
 select 1, null union all
 select 2, null union all
 select 3, null union all
 select 4, 1;
go
insert into dbo.Test
 (usr_id, customer_id)
 select 5, 1;
go
drop table dbo.Test;
go

 
19 янв 12, 13:57    [11932542]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
GlebZ
Member

Откуда: USA
Сообщений: 286
А если не городить огород и создать таблицу tbl_UserToCustomers? User - Unique, Customer.... тоже можно. Те юзверя, что не в этой таблице - кастомеров не имеют.
Потому как завтра (или через годик-два) вам изменят условия и скажут, что One to many. И пойдете вы глобально переписывать все. А так только unique убрать.
19 янв 12, 19:11    [11935418]     Ответить | Цитировать Сообщить модератору
 Re: Связь один-к-одному с nullable значениями  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
GlebZ
... и скажут, что One to many. И пойдете вы глобально переписывать все. А так только unique убрать.
А так тоже только unique убирать. :)

GlebZ
И пойдете вы глобально переписывать все.
1. Не надо боятся переписывать. Наоборот. Главное чтоб переписывание не ради переписывания.
2. "Ваша" старая структура может плохо ложитья под новые реалии one-to-many и планы выпадать и сложные проверки писать и т.п.
Какгрится isdepends.

М.б. там вообще всё в одну таблу надо запихать с NULL колонками.
Шучу.
19 янв 12, 19:46    [11935576]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить