Create Table Client (id int primary key, name nvarchar(max))
Create Table Contact(id int primary key, name nvarchar(max), ClientId int, constraint FK_Contact_Client foreign key (ClientId) references Client(Id))
Alter Table Client add ContactId int, constraint FK_Client_Contact foreign key (ContactId) references Contact(Id)
Вставка ни в одну таблицу не работает если, обе записи новые.
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Client_Contact". The conflict occurred in table "dbo.Contact", column 'Id'.
Нельзя такие ограничения использовать?
С тчк зрения ООП вроде все корректно.
Нужно только вставку сделать в одну таблицу до того как у второй появится значение первичного ключа.
Здравствуйте, varenikAA, Вы писали:
AA>Нужно только вставку сделать в одну таблицу до того как у второй появится значение первичного ключа.
Попробуй сделать поле Client.ContackId null. И не создавай клиента до контакта.
Здравствуйте, varenikAA, Вы писали:
AA>Нельзя такие ограничения использовать? AA>С тчк зрения ООП вроде все корректно. AA>Нужно только вставку сделать в одну таблицу до того как у второй появится значение первичного ключа.
А словами описать можешь, что нужно получить?
Здравствуйте, Dym On, Вы писали:
DO>Здравствуйте, varenikAA, Вы писали:
AA>>Нельзя такие ограничения использовать? AA>>С тчк зрения ООП вроде все корректно. AA>>Нужно только вставку сделать в одну таблицу до того как у второй появится значение первичного ключа. DO>А словами описать можешь, что нужно получить?
Открываем карту клиента,
на вкладке контакт выбирает из таблицы персоны запись в качестве контакта,
в карту клиента записываем айди контакта как контакт по умолчанию, в таблице контакты должна быть запись
многих контактов, в таблице клиент храним ссылку на основной контакт, получается не может сохранить одно
не сохранив другого из-за нарушения ссылочной целостности.
Пока удалил внешний ключ и клиентов. Второе решение как мне думается использовать аттрибут "основной" в таблице контактов.
Здравствуйте, Mihas, Вы писали:
M>Здравствуйте, varenikAA, Вы писали:
AA>>Нужно только вставку сделать в одну таблицу до того как у второй появится значение первичного ключа. M>Попробуй сделать поле Client.ContackId null. И не создавай клиента до контакта.
К сожалению, такой вариант не пройдет, т.к. контакт ссылается на клиента(ограничение целостности).
Здравствуйте, varenikAA, Вы писали:
M>>Попробуй сделать поле Client.ContackId null. И не создавай клиента до контакта. AA>К сожалению, такой вариант не пройдет, т.к. контакт ссылается на клиента(ограничение целостности).
Ну и пусть ссылается, когда появится. Не пойму, чем мешает?
Я может не так выразился. Я имел в виду, поле Client.ContactId должно быть nullable.
Здравствуйте, varenikAA, Вы писали:
AA>Открываем карту клиента, AA>на вкладке контакт выбирает из таблицы персоны запись в качестве контакта, AA>в карту клиента записываем айди контакта как контакт по умолчанию, в таблице контакты должна быть запись AA>многих контактов, в таблице клиент храним ссылку на основной контакт, получается не может сохранить одно AA>не сохранив другого из-за нарушения ссылочной целостности. AA>Пока удалил внешний ключ и клиентов. Второе решение как мне думается использовать аттрибут "основной" в таблице контактов.
Пока каша. Из этого описания можно выделить сущности "Карта клиента", "Клиент", "Контакт", "Персона" — это разные сущности?
Какое отношение между "Клиентами" и "Контактами"? 1-1, 1-n, n-n?
Пока не понятно, но подозреваю, что должно быть как-то так:
Здравствуйте, varenikAA, Вы писали:
AA>Туплю AA>сделал таблицу AA>
AA>Create Table Client (id int primary key, name nvarchar(max))
AA>Create Table Contact(id int primary key, name nvarchar(max), ClientId int, constraint FK_Contact_Client foreign key (ClientId) references Client(Id))
AA>Alter Table Client add ContactId int, constraint FK_Client_Contact foreign key (ContactId) references Contact(Id)
AA>
AA>Вставка ни в одну таблицу не работает если, обе записи новые.
AA>Нельзя такие ограничения использовать?
Нельзя.
AA>Нужно только вставку сделать в одну таблицу до того как у второй появится значение первичного ключа.
Я так понимаю, что цель "у одного клиента много контактов, и у одного контакта много клиентов", тогда это связь "многие-ко-многим" и такое делается через третью таблицу cross-reference table, которая ссылается на обе исходных и хранит каждую из многих связей.
Если цель иерархия "у одного клиента есть мастер-контакт, к которому привязаны дополнительные клиенты", тогда надо делать иерархическую таблицу и внешние ключи будут ссылаться не перекрестно.
Здравствуйте, Mihas, Вы писали:
M>Здравствуйте, varenikAA, Вы писали:
M>>>Попробуй сделать поле Client.ContackId null. И не создавай клиента до контакта. AA>>К сожалению, такой вариант не пройдет, т.к. контакт ссылается на клиента(ограничение целостности). M>Ну и пусть ссылается, когда появится. Не пойму, чем мешает? M>Я может не так выразился. Я имел в виду, поле Client.ContactId должно быть nullable.
Пока так и сделал — удалил ограничение из таблицы Client.
Здравствуйте, Dym On, Вы писали:
DO>Здравствуйте, varenikAA, Вы писали:
AA>>Открываем карту клиента, AA>>на вкладке контакт выбирает из таблицы персоны запись в качестве контакта, AA>>в карту клиента записываем айди контакта как контакт по умолчанию, в таблице контакты должна быть запись AA>>многих контактов, в таблице клиент храним ссылку на основной контакт, получается не может сохранить одно AA>>не сохранив другого из-за нарушения ссылочной целостности. AA>>Пока удалил внешний ключ и клиентов. Второе решение как мне думается использовать аттрибут "основной" в таблице контактов. DO>Пока каша. Из этого описания можно выделить сущности "Карта клиента", "Клиент", "Контакт", "Персона" — это разные сущности?
DO>Какое отношение между "Клиентами" и "Контактами"? 1-1, 1-n, n-n?
DO>Пока не понятно, но подозреваю, что должно быть как-то так: DO>
Да 1-n, спасибо за подробный пример, у меня только is_main выполняет поле Client.ContactId(убрал на нем ограничение). Если использовать is_main то, нужно не забывать при смене основного контакта менять флаг у остальных.
Здравствуйте, varenikAA, Вы писали:
M>>Я может не так выразился. Я имел в виду, поле Client.ContactId должно быть nullable.
AA>Пока так и сделал — удалил ограничение из таблицы Client.
Ты не понял совета. Ограничение FK должно работать только, когда Client.ContactId заполнено.
Здравствуйте, varenikAA, Вы писали:
AA>Туплю AA>сделал таблицу AA>
AA>Create Table Client (id int primary key, name nvarchar(max))
AA>Create Table Contact(id int primary key, name nvarchar(max), ClientId int, constraint FK_Contact_Client foreign key (ClientId) references Client(Id))
AA>Alter Table Client add ContactId int, constraint FK_Client_Contact foreign key (ContactId) references Contact(Id)
AA>
AA>Вставка ни в одну таблицу не работает если, обе записи новые.
AA>Нельзя такие ограничения использовать? AA>С тчк зрения ООП вроде все корректно. AA>Нужно только вставку сделать в одну таблицу до того как у второй появится значение первичного ключа.
Здесь две вещи:
1. Люди
2. Связи между людьми
Вот и оформи эти две вещи в виде двух таблиц.
Связь между двумя человеками будет представлена тремя записями. Две в первой таблице и одна во второй.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, varenikAA, Вы писали:
M>>>Я может не так выразился. Я имел в виду, поле Client.ContactId должно быть nullable.
AA>>Пока так и сделал — удалил ограничение из таблицы Client.
W>Ты не понял совета. Ограничение FK должно работать только, когда Client.ContactId заполнено.
Разве в sql server и вообще можно ставить ограничение на поле с NULL, ведь по логике в контактах тогда должна быть запись ключом NULL?