Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
Добрый день коллеги, В таблице есть поле которое является идентификатором, ссылающаяся на одну из двух таблиц, т.е FK не явный - в одной записи он может указывать на запись таблицы T1, в другой записи на запись таблицы T2. Можно ли не создавая 2 поля и имя потом в таблице подобную чехарду FK_Field1 | FK_Field2 создать одно поле как ссылку сразу на 2? Что-то я даже не знаю как это в поисковике написать чтобы почитать полезное и вообще можно ли. |
29 ноя 12, 15:12 [13550105] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Просто взять и написать скрипт на создание двух FK ? Или в студии в гуи это сделать |
||
29 ноя 12, 15:16 [13550137] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
OracleLover, А как вы отличаете, что в одной записи идентификатор указывает на T1, а в другой — на T2? |
29 ноя 12, 15:24 [13550212] Ответить | Цитировать Сообщить модератору |
HandKot Member Откуда: Sergiev Posad Сообщений: 3027 |
создать-то можно, но по-моему, будут ошибки, если таблицы Т1 и Т2 различны по содержанию т.е если ID= 1 есть в Т1, но нет в Т2, то получите ошибку и т.д |
29 ноя 12, 15:27 [13550250] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
Не, ошибко. Пример для наглядности приведу. Table1 Table2 Table3 Вот скрипт CREATE TABLE [dbo].[Table3]( [Id] [int] IDENTITY(1,1) NOT NULL, [Type] [varchar](255) NOT NULL, [FK_ID] [int] NOT NULL, CONSTRAINT [PK_Table3] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[Table3] WITH CHECK ADD CONSTRAINT [FK_Table3_Table1] FOREIGN KEY([FK_ID]) REFERENCES [dbo].[Table1] ([T1_Id]) GO ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table1] GO ALTER TABLE [dbo].[Table3] WITH CHECK ADD CONSTRAINT [FK_Table3_Table2] FOREIGN KEY([FK_ID]) REFERENCES [dbo].[Table2] ([T2_Id]) GO ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table2] GO Если пытаешься вставить запись со ссылкой 10, то пишет что не срабатывает ибо нет такого id в таблице T1. |
||||
29 ноя 12, 15:33 [13550312] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13147 |
делать 2 нуловых поля и 2 форина с них + чек, который обеспечит заполнение хотя бы одного поля. дальше - согласно вашей модели данных. при необходимости - обернуть таблицу представлением, где будет 1 поле, я так понимаю, у вас вопроса "а когда там чего" - не возникает |
29 ноя 12, 15:34 [13550318] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
у меня есть битовое поле где искать гыы, круто я придумал? В итоге я конечно в количестве поле не выиграл, но зато у меня хотя бы не будет решетка из NULL |
||
29 ноя 12, 15:35 [13550326] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
поправелTable3 |
29 ноя 12, 15:36 [13550338] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
И что неправильного делает констрейнт ? Вы же хотели, чтобы он проверял обе таблицы |
||
29 ноя 12, 15:36 [13550343] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
Если убрать ALTER TABLE ... CHECK CONSTRAINT ошибка все равно есть. Можно конечно забить на FK, и сделать просто обычно поле, которое на самом деле ссылка и не следить за целостностью - но я поэтому и спросил можно ли чтобы сервер следил за целостностью по схеме - нет здесь, позырить в другой таблице если и там нет - тогда уж вот те ошибка. |
||||
29 ноя 12, 15:40 [13550374] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
как? |
||
29 ноя 12, 15:41 [13550383] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
CHECK как раз разрешает проверку |
||
29 ноя 12, 15:43 [13550404] Ответить | Цитировать Сообщить модератору |
пользоват.11 Member Откуда: Сообщений: 19 |
даже в любимом Вами Оракле такое невозможно, т.к. это в принципе противоречит ссылочной целостности, поддержку которой мы ожидаем от субд. если во внешний ключ попадает значение из одной справочной таблицы, то это автоматически нарушает ссылочную целостность для другой справочной таблицы |
29 ноя 12, 15:45 [13550411] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
А все. Я запутался. Я разные комбинации попробовал и with check и без, все равно сервер думает что я хочу FK который проверяет наличие ссылки сразу в двух таблицах(&&) а мне нужно или там, или там чтобы было(||) |
||||
29 ноя 12, 15:46 [13550423] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
сейчас если Глори напишет "ааа, ну так конечно нельзя" - замутю 2 поля и покину лоно оппозиции. |
||
29 ноя 12, 15:50 [13550449] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Что нельзя то ? "создать одно поле как ссылку сразу на 2? " - можно. Вы сами предоставили скрипт А заставить констрейт каким то магическим образом определять, для какой именно из таблиц должна быть проведена проверка текущей записи, разумеется нельзя |
||
29 ноя 12, 15:55 [13550495] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
По-моему, не круто. Цель какая? Сэкономить место на диске? :) Если оставлять такую схему данных, то целостность можно контролировать триггерами на всех таблицах. Форин кеями не получится. |
||||
29 ноя 12, 15:57 [13550519] Ответить | Цитировать Сообщить модератору |
пользоват.11 Member Откуда: Сообщений: 19 |
просто у меня недавно такой же вопрос стоял и прикинув, чего будет стоить мне поддержка специфики такого поля, я банально создал 2 таких поля, по одному на каждый FK Поскольку поддержки в реляционных базах такого двойного отношения я не видел нигде |
29 ноя 12, 15:57 [13550521] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
да вроде нормуль с точки зрения целостности, есть у меня поле которое по бизнес-логике ссылается сразу например на 10 таблиц. Флагов создания констрейнта в msdn целая туча, я наивно полагал что там что-нить есть для этого случая. Вот я создал первый констрейнт, второй... десятый. Логично же что и смотреть бы серверу в той же последовательности - проверил первую табличку, там такой нет? нет. пошли дальше во вторую. и тут нет? идем дальше и т.д Если дошли до десятой и там нет - все, стандартная ошибка. С точки зрения логики никаких коллизий или неопределенностей. |
||
29 ноя 12, 16:03 [13550583] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
А если в двух есть, а третьей нет ? Это по-вашему, определенность ? |
||
29 ноя 12, 16:05 [13550604] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
Да, типичный .FirstOrDefault() MS его очень любит |
||||
29 ноя 12, 17:02 [13551187] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Там есть ClientID=1 и там есть ClientID=1 Только там Иванов, а там - Петров Интересно, кого же мне выбрать ? |
||
29 ноя 12, 17:06 [13551255] Ответить | Цитировать Сообщить модератору |
ZOOKABAKODER Member Откуда: Сообщений: 178 |
Вы меня конечно извините, я что-то запутался в обсуждении. Короче это IMHO стандартное наследование. Реализуется оно через дискриминант.Надеюсь понятно описываю, лень на SQL писать. В таблицах вот что может быть:
|
29 ноя 12, 17:45 [13551709] Ответить | Цитировать Сообщить модератору |
OracleLover Member Откуда: Россия, Казань Сообщений: 20899 |
смотря в какой очередности задавали FK |
||||
29 ноя 12, 18:31 [13551988] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
А если завтра я пересоздам один или несколько ? А если это буду не я, а другой dba ? |
||
29 ноя 12, 18:35 [13552020] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |