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

Откуда:
Сообщений: 45
Внешний ключ таблицы_1 ссылается на таблицу_2.
Внешний ключ таблицы_2 ссылается на таблицу_1.

Как тогда добавить строки в такие таблицы?

CREATE TABLE Husbands
(
hId int IDENTITY PRIMARY KEY,
wifeId int NOT NULL
)

CREATE TABLE Wifes
(
wId int IDENTITY PRIMARY KEY,
husbandId int NOT NULL
)

ALTER TABLE Husbands
ADD CONSTRAINT FK_Husbands_Wifes FOREIGN KEY (wifeId)
REFERENCES Wifes (wId)

ALTER TABLE Wifes
ADD CONSTRAINT FK_Wifes_Husbands FOREIGN KEY (husbandId)
REFERENCES Husbands (hId)
11 сен 11, 19:45    [11260894]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
step_ks
Member

Откуда:
Сообщений: 936
Версия сервера какая?
insert + update fk, например.
11 сен 11, 19:49    [11260904]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
newbie876454
Member

Откуда:
Сообщений: 45
2008 R2
11 сен 11, 19:51    [11260907]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
newbie876454,

сделать либо wifeId int NULL либо husbandId int NULL,
да и дело с концом!
11 сен 11, 20:01    [11260939]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
iljy
Member

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

Человека, который такое спроектировал, надо подвешивать за яйца и дергать за уши, пока что-нибудь не оторвется. Хотя добавить конечно можно

insert Husbands(wifeId) values (null)
declare @idH int = SCOPE_IDENTITY()
insert Wifes(husbandId) values(@idH)
declare @idW int = SCOPE_IDENTITY()
update Husbands set wifeId = @idW where hId = @idH
11 сен 11, 20:03    [11260943]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
newbie876454
Member

Откуда:
Сообщений: 45
step_ks,
автор
insert + update fk, например.

Простите за наглость, можно примерчик?


iap,

В этом случае страдает целостность БД.
Предметная область такова, что не может быть мужа без жены, и наоборот.
Помимо этого по некоторым соображениям не могу держать их в одной таблице.
11 сен 11, 20:06    [11260950]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
newbie876454
Member

Откуда:
Сообщений: 45
А без разрешения NULL как-то можно?
11 сен 11, 20:11    [11260958]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
iljy
Member

Откуда:
Сообщений: 8711
newbie876454
В этом случае страдает целостность БД.
Предметная область такова, что не может быть мужа без жены, и наоборот.
Помимо этого по некоторым соображениям не могу держать их в одной таблице.

А она у вас и так страдает - где гарантия, что записи друг на друга ссылаются?
Заведите отдельную таблицу Семья и обвесте все триггерами с проверками целостности.
newbie876454
А без разрешения NULL как-то можно?

Можно. Заведите записи "Всеобщая жена" и Всеобщий муж" и сначала вставляйте запись со ссылками на них. Будет бред, но увлекательный.
11 сен 11, 20:18    [11260976]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
newbie876454
step_ks,
автор
insert + update fk, например.

Простите за наглость, можно примерчик?


iap,

В этом случае страдает целостность БД.
Предметная область такова, что не может быть мужа без жены, и наоборот.
Помимо этого по некоторым соображениям не могу держать их в одной таблице.
Вы не можете одной инструкцией вставить записи в две таблицы.
Можете только вставить запись, ссылающуюся на существующую в другой таблице,
потом точно так же в другую, а потом проапдейтиь обе таблицы. Всё при монопольной блокировке.
Однако, как вставить первые записи??? Да и такой уровень блокировки - ужасен.
Можно дизэйблить FK, а после вставки инэйблить. Но что-то мне подсказывает,
что такой трюк при многопользовательском доступе может и не работать.
Это если закрыть глаза на концептуально недопустимую смесь DDL и DML в этом случае.

Если не сделать, как я сказал, задача не имеет решения.
11 сен 11, 20:22    [11260986]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
step_ks
Member

Откуда:
Сообщений: 936
newbie876454
step_ks,
автор
insert + update fk, например.

Простите за наглость, можно примерчик?

iljy уже опередил с примером
11 сен 11, 21:02    [11261068]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
Antoshka
Member

Откуда:
Сообщений: 828
А потом мы удивляемся, почему в госорганах бесконечные "сбои в программах"
12 сен 11, 09:40    [11262156]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
step_ks
Member

Откуда:
Сообщений: 936
newbie876454
В этом случае страдает целостность БД.
Предметная область такова, что не может быть мужа без жены, и наоборот.

А многоженство может быть, я так понимаю?
12 сен 11, 09:57    [11262236]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Известны случаи, когда в семье два мужа и ни одной жены!
12 сен 11, 10:10    [11262325]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6900
Шутки шутками...

А может, в таком случае вообще отказаться от FK, а проблемы ссылочной целостности возложить на приложение? Поскольку используется транзакционная СУБД...
12 сен 11, 10:10    [11262326]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
AndreTM
Шутки шутками...

А может, в таком случае вообще отказаться от FK, а проблемы ссылочной целостности возложить на приложение? Поскольку используется транзакционная СУБД...
Одно дело, когда FK из таблицы мужа ссылается на вполне определённую запись
таблицы жены, которой, однако, уже нет по какой-то причине.
И другое дело, если значение FK IS NULL, что явным образом легко интерпретируется как "муж, временно не имеющий жены".
Наличие FK полностью исключает возможность первого случая,
а второй легко обнаруживается и корректируется, если что.

Однако, как правильно заметил step_ks, отношение Муж-Жена вовсе не 1:1.
Поэтому должна быть третья таблица - таблица родственных связей.
И вот там-то и надо сделать два FK. И уже никаких проблем возникуть не должно.
12 сен 11, 10:19    [11262373]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6900
iap
И другое дело, если значение FK IS NULL, что явным образом легко интерпретируется как "муж, временно не имеющий жены"

Вообще-то, пример ТС'а немного притянут за уши, ибо разбивать пиплов на хазбендов и вайфов - последнее дело.
А с данным решением (насчет отдельной таблицы) - совершенно согласен. В-принципе, именно на это и я пытался натолкнуть ТС'а...
12 сен 11, 10:34    [11262460]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
iljy
newbie876454,
Человека, который такое спроектировал, надо подвешивать за яйца и дергать за уши, пока что-нибудь не оторвется. Хотя добавить конечно можно

голосую за ) кто такую схему бд загадал - капитальный красаучык :D
12 сен 11, 10:38    [11262485]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Топиккастер, а структуру переделать никак нельзя?
12 сен 11, 10:48    [11262525]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
Евгений Фадеев
Member [заблокирован]

Откуда: Russia, Moscow
Сообщений: 2374
newbie876454
В этом случае страдает целостность БД.
Предметная область такова, что не может быть мужа без жены, и наоборот.
Помимо этого по некоторым соображениям не могу держать их в одной таблице.

Немного запоздало, но тем не менее:
1. Присоединяюсь к тем, кто желает различных горестей на голову проектировщика-извращенца
2. Хотя схема - прекрасный пример того, что "Дай дураку стеклянный ... - так он разобьет, да еще и порежется!". Если не может быть мужа без жены, а жены без мужа - не надо делать две таблицы: сделайте одну (MarriedСouples), а в ней два поля HusbandID и WifeID, которые в свою очередь, ссылаются на Человеков (не знаю как у вас там это организовано).

И еще: жутко любопытно что это за соображения такие, по которым две части одной сущности (Семья) нельзя держать в одной таблице.
3 окт 11, 19:59    [11377376]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Евгений Фадеев
И еще: жутко любопытно что это за соображения такие, по которым две части одной сущности (Семья) нельзя держать в одной таблице.
Могу порадовать: всё можно хранить не только в одной таблице,
а в одном поле таблицы! Типа, например, VARBINARY(MAX).
Действительно, чего в этом сервере накрутили!

А если серьёзно, то сколько мужей и жён может быть в объекте "семья"? Что там с нормальными формами?
3 окт 11, 20:09    [11377414]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
Евгений Фадеев
Member [заблокирован]

Откуда: Russia, Moscow
Сообщений: 2374
iap
Могу порадовать: всё можно хранить не только в одной таблице,
а в одном поле таблицы! Типа, например, VARBINARY(MAX).
Кэп? Вот только я не увидел в чем именно радость.
iap
А если серьёзно, то сколько мужей и жён может быть в объекте "семья"? Что там с нормальными формами?
В объекте семья может быть (и должны) один муж и одна жена (если мы не ведем речь об исламских странах, но там схема должна быть несколько другой, как, впрочем, и схема для некоторых племен, в которых практикуется многомужество). С нормальными формами все в порядке. Или это не очевидно?
3 окт 11, 20:19    [11377446]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Евгений Фадеев
В объекте семья может быть (и должны) один муж и одна жена (если мы не ведем речь об исламских странах, но там схема должна быть несколько другой, как, впрочем, и схема для некоторых племен, в которых практикуется многомужество). С нормальными формами все в порядке. Или это не очевидно?
Конечно, неочевидно.
Многожёнство - это суровая действительность в современной России.
Разве не может быть семьи без мужа или без жены?
3 окт 11, 21:19    [11377672]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
Евгений Фадеев
Member [заблокирован]

Откуда: Russia, Moscow
Сообщений: 2374
iap
Евгений Фадеев
В объекте семья может быть (и должны) один муж и одна жена (если мы не ведем речь об исламских странах, но там схема должна быть несколько другой, как, впрочем, и схема для некоторых племен, в которых практикуется многомужество). С нормальными формами все в порядке. Или это не очевидно?
Конечно, неочевидно.
Многожёнство - это суровая действительность в современной России.
Разве не может быть семьи без мужа или без жены?

Вы, по всей видимости, невнимательно читали постановку (соответствующая цитата была в моем первом сообщении). Поэтому рассуждаете о решении несколько другой задачи. К тому же Гражданский кодекс не подразумевает многоженства на территории РФ (хотя к обсуждаемому вопросу это и не имеет отношения).
А если рассматривать ситуацию в общем, то на нее нет ограничений и брак - это набор линков между объектами типа Человек (с одним ограничением: объекты на концах этого линка должны различаться - нельзя состоять в браке с самим собой). Так описывается наиболее общий вариант (условно - шведская семья). Далее - по возрастающей: ограничение уникальности на объект Жена - исламский вариант (один муж - много жен), ограничение уникальности на объект Муж - вариант многомужества, ограничение уникальности на объект Муж + ограничение уникальности на объект Жена - дает нам ситуацию обычную семью.

Хотя в свете последних изменений в Стране Передовой Демократии термины муж и жена являются устаревшими и подлежат замене на Партнер1 и Партнер2. Но это уже совсем другая история...
3 окт 11, 21:35    [11377740]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Мдя... Все-таки иногда Deferrable Constraints очень бы были кстати. ;)

Сообщение было отредактировано: 3 окт 11, 22:01
3 окт 11, 22:01    [11377842]     Ответить | Цитировать Сообщить модератору
 Re: Одна таблица ссылается на вторую, вторая на первую. Как добавить строки?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
pkarklin
Мдя... Все-таки иногда Deferrable Constraints очень бы были кстати. ;)
Интересно конечно, но не вписывается.
"Алгоритм нормализации" как здесь себя ведёт?
4 окт 11, 03:29    [11378490]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить