|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|
Foreign KEY23.03.2017, 13:59. Показов 3720. Ответов 33
Метки нет (Все метки)
Здравствуйте форумчане. Помогите с проблемой. Впервые настраиваю связи в БД. Ситуация: есть 4 справочника (приведу сокращенные названия)
1. Company - организация. В нем ID_Company первичный ключ. 2. Filial - филиалы организации. Поле ID_Fil - первичный ключ. 3. Rank - категория сотрудников филиала Поле ID_Rank первичный ключ 4. Prof - список профессий. ID_Prof первичный ключ. Так вот в Prof мне надо ссылаться на ключи первых 3х таблиц с каскадным Update. Строю так Prof.ID_FIL зависит от Filial.id_fil, Prof.id_rank зависит от Rank.ID_rank и prof.id_company зависит от company.id_company. Т.е если меняется ID в головных таблицах, то и в таблице Prof эти айдишники меняются. Так вот 2 связи MS SQL 2008 r2 дает построить, а третье поле выдает ошибку: Не удалось создать связь "FK_Professions_Spr_Fil".Введение ограничения внешнего ключа (FOREIGN KEY) "FK_Professions_Spr_Fil" для таблицы "Professions" может привести к появлению циклов или множественных каскадных путей. И т.д. Удаляю одну любую из связей и все ок. Третью не дает поставить... Что делать?
0
|
|
| 23.03.2017, 13:59 | |
|
Ответы с готовыми решениями:
33
Truncate, delete и foreign key Получение информации о Foreign Key The INSERT statement conflicted with the FOREIGN KEY |
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
|
| 23.03.2017, 14:41 | |
|
Начнём с того, зачем нужен каскадный update id-ов. Вам так важно какой id у профессии в списке профессий? Кто-то потребует изменить id директора, потому что там число 13 просматривается?
0
|
|
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|
| 23.03.2017, 16:18 [ТС] | |
|
Конечно важно, какой Id у профессии. В данный момент 10 филиалов у каждого свои профы. База и справочник профессий соответственно один. ID_Prof в данном случае это код профессии и у каждого филиала он будет свой, и уникальный. Зачем, допустим в справочнике сотрудников писать профу, принадлежность к филиалу и категорию сотрудника, если можно указать все это кодами? В справочниках поменял код и связанные поля в других таблицах автоматом изменяют этот код. Или изменился код филиала в справочнике филиалов, тогда и во всех таблицах связанных по коду филиала этот код должен меняться. Зачем мне программно за этим следить и городить кучу строк кода запросов, если этот функционал можно возложить на СУБД? Тут пока ситуация получается, что в таблице не может быть более
двух связей?
0
|
|
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
|||
| 23.03.2017, 16:41 | |||
|
Добавлено через 6 минут Но зачем в таблице Company Id Name 1 Рога 2 Копыта делать 2 Копыта 3 Рога ???
0
|
|||
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|
| 23.03.2017, 17:17 [ТС] | |
|
блооооо.... Я так назвал поле ID_Prof - идентификационный код профессии. Меняться он не просто может,а ДОЛЖЕН. Изменилась политика предприятия, штатное расписание, реструктуризация организации и т.д. Поэтому необходимо предусмотреть не только смену наименования профессии (был аккумуляторщик код профессии 11, а стал мегааккумуляторщик с кодом профы 11), но и кода самой профессии при необходимости. Наменование содержится в 1 справочнике и с его изменением проблем нет, а вот к коду профы может быть привязано много таблиц. Поэтому и необходим автоматический Update всех таблиц, привязанных и содержащих этот код. Эта таблица у меня по разным кодам привязана к 3 головным таблицам. Любые 2 связи работают, но стоит добавить третью летит ошибка. Причем не важно с какой таблицей я строю связь в конце. будет 3 company на нее заорет, будет spr_fil то на нее, а будет rank то значит ее в топку, а другие проглотит.
Рога 1 контрагент Я тоже Рога - говорит другой контрагент. Как их различить если не по коду? Добавлено через 29 минут Блин... Создаю таблицу сотрудников организации. Там вообще в основном вся инфа связана со справочниками и такая же фигня... Третью связь построить не дает. А если поставить на Update NO ACTION, то я так понимаю смысла от связи не будет и обновляться таблица в зависимости от справочников тоже не будет?
0
|
|
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
||
| 23.03.2017, 17:27 | ||
заведи суррогатные ключи у справочников вместо естественных, если их приходится править, и забудь вообще про необходимость править Id-ы, они ничего не должны значить, а только обеспечивать связь между таблицами.
0
|
||
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|||
| 23.03.2017, 18:40 [ТС] | |||
ска... NO ACTION ставишь - глотает но пишешь update table set bla-bla-bla... where bla-bla-bla и ппц... ошибки связей.
0
|
|||
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
||
| 24.03.2017, 00:26 | ||
|
вот, например, Company. Пусть это будут российские компании. У всех у них есть ИНН, который можно было бы использовать в качестве естественного ключа. И тогда при смене ИНН (или просто корректировке ошибочно введенного) пришлось бы и впрямь исправлять и Filial.Company (который в этом случае был бы равен ИНН). Но мы ИНН делаем просто атрибутом, а для ключа используем автоинкрементное поле Id. Это и есть суррогатный ключ. И теперь при смене ИНН изменится только атрибут Company,.INN, но нам ничего НЕ НАДО ДЕЛАТЬ с подчиненными таблицами, т.к. связь по Filial.Company-Company.ID как была, так и осталась. Только ID-ы корректировать не надо (при автоинкременте это и непросто сделать). Ну а в простых справочниках типа (Id, NAME) не надо и бездумно править Name, а то все аккумуляторщики враз станут директорами филиалов
0
|
||
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
||
| 24.03.2017, 08:35 [ТС] | ||
|
Да чё ты доеб...ся до этих id-шников?? Я те еще раз говорю что это НЕ ИДЕНТИФИКАТОР. Поле-идентификатор автоинкрементное у меня совершенно другое. А другие поля с ДАННЫМИ (ну типа ИНН как в твоем примере) я как хочу так и называю. Назвал ID_FIL - это значит идентификационный номер филиала организации. Типа ОГРН. Почитай внимательно предыдущий текст. И при чем тут
Добавлено через 5 минут id - автоинкремент id_prof - идентификатор провессии Name_Prof - наименование профы. 1 152 аккумуляторщик 2 155 мазахист 3 200 биг босс поменялась штатка 1 10 аккумуляторщик 2 20 мазахист-аккумуляторщик 3 30 Биг босс мазахиста-аккумуляторщика Так понятней?
0
|
||
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
|||
| 24.03.2017, 09:14 | |||
|
Если у тебя существует prof.id_company - то это никакой не справочник профессий. Что это за профессии, называющиеся одинаковые, но имеющие разные записи для разных компаний? Значит это штатное, но тогда название должности/профессии должно храниться в другой таблице. Добавлено через 32 минуты если поменялась, то надо до и после в штатке не должно быть никаких 'аккумуляторщик' там должен быть id из таблицы prof. Именно Id, а не id_prof и не Name_Prof. Все это должно оставаться (и меняться при острой необходимости) в таблице prof там должно быть до в компании 1 было 10 ставок аккумуляторщика с окладом 30 тыс.рублей в компании 2 было 20 ставок таких же аккумуляторщиков id Company prof_id Count Wage ... 1 1 1 10.0 30.000 ... 1 2 1 20.0 30.000 ... после в компании 2 решили вместо 20 ставок аккумуляторщика ввести 10 ставок мазахист-ов с окладом 60.000 1 2 2 10.0 60.000 ... т.е. мы просто выбираем другую запись из справочника, зачем справочник менять?
0
|
|||
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|
| 24.03.2017, 09:43 [ТС] | |
|
Да. Упертый. Потому что это лишь пример. Смотри. Rank – категория профессий.
Поле Тип данных Описание Уникальный ключ Зависимость (таблица.поле) ID int Идентификатор записи (счетчик) ID_Rank Int Идентификатор профессии Да Rank_Name Nvarchar 255 Наименование профессии Далее Company – наименование организации. Поле Тип данных Описание Уникальный ключ Зависимость(таблица.поле) ID int Идентификатор записи (счетчик) ID_Company Int Идентификатор организации Да Company Nvarchar 255 Наименование организации Далее Spr_Fil – справочник филиалов. Поле Тип данных Описание Уникальный ключ Зависимость(таблица.поле) ID int Идентификатор записи (счетчик) ID_FIL Int Идентификационный номер филиала Да FIL Nvarchar 255 Наименование филиала ID_Company Int Идентификатор организации Company.ID_Company И вот хотя бы Professions – справочник профессий. Поле Тип данных Описание Уникальный ключ Зависимость (таблица.поле) ID int Идентификатор записи (счетчик) ID_Prof Int Идентификатор профессии Да Profession Nvarchar 255 Наименование профессии Category Int Категория/разряд профессии Category_Name Nvarchar 50 Наименование категории/разряда Unheality int Вредность (логическое) 0 – нет, 1 – да. ID_Rank Int Вид профессии (специалист/рабочий/руководитель) Rank.ID_Rank ID_Company Int Идентификатор организации Company.ID_Company ID_FIL Int Идентификатор филиала SPR_FIL.ID_FIL Overtime Int Ненормированный рабочий день (логическое) 0 – нет, 1 – да. А теперь еще раз во что я уперся. Ставлю зависимости SPR_FIL.ID_FIL и Rank.ID_Rank все норм с каскадным обновлением. Добавляю зависимость Company.ID_Company и северный пушной зверек получается в виде ошибки FOREIGN KEY. Будет еще таблица сотрудников. Там еще больше связей со справочниками, а больше двух справочников связать не дает. Пздц. Представь себе 5000 сотрудников, которые при изменении кода филиала перестанут существовать образно говоря Или код профессии поменялся. Да вообще любое изменение справочника без каскадного изменения данных приведет к реальному коллапсу. Потому как связь вроде есть, но ее тут же нет ![]() Добавлено через 6 минут И да. Я не про 1С тебе говорю. Я свое ПО писать буду для организации. Поэтому и свою базу надо правильно и хорошо сконфигурить и продумать, прежде чем за код браться.
0
|
|
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
|||
| 24.03.2017, 09:59 | |||
|
Начнем сначала. И понемногу
.
почему недостаточного того самого поля Id для суррогатного ключа и связи с другими таблицами? Добавлено через 4 минуты Аналогично здесь
Добавлено через 6 минут если вместо этого ID_Rank Int Вид профессии (специалист/рабочий/руководитель) Rank.ID_Rank ID_Company Int Идентификатор организации Company.ID_Company ID_FIL Int Идентификатор филиала SPR_FIL.ID_FIL будет как должно быть ID_Rank Int Вид профессии (специалист/рабочий/руководитель) Rank.Id ID_Company Int Идентификатор организации Company.Id ID_FIL Int Идентификатор филиала SPR_FIL.Id то и не возникнет желания каскадного обновления Id-ов
0
|
|||
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|
| 24.03.2017, 10:14 [ТС] | |
|
ID_RANK -вид профессии. Допустим
id id_rank Rank_Name 1 1 специалист 2 2 рабочий 3 3 руководитель 4 4 студент 5 5 наемный рабочий и т. д. Можно, конечно в таблице сотрудников указать ручками Rank_name, а можно и связать поле со справочником и взять код вида профессии из справочника при запросе. И при изменении вида профы и наименования мне не надо вручную 2000 специалистов лопатить и менять им вид. Да и отслеживать другие таблицы (а их может быть очень много), связанные с этим справочником мне не надо. Достаточно внести изменения в справочник и указать, что теперь категория специалист (ID_Rank) теперь не 1, а 6 и у всех 2000 спецов в таблицах вид профы сразу меняется с 1 на 6. Идея понятна? А если в таблице связей со справочниками более двух, то все. Не работает. Добавлено через 2 минуты еще раз повторяю Я НЕ ХОЧУ МЕНЯТЬ ID-ШНИКИ Данные могут измениться На id-шники мне глубоко плевать. Пусть СУБД их отслеживает и наращиваетДобавлено через 1 минуту было id id_rank rank_name 1 1 специалист 2 2 рабочий 3 3 руководитель 4 4 студент 5 5 наемный рабочий стало id id_rank rank_name 1 6 специалист 2 9 рабочий 3 3 руководитель 4 4 студент 5 5 наемный рабочий
0
|
|
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
||
| 24.03.2017, 10:21 | ||
|
1 1 специалист поле id_rank поменялось с 1 на 6. Уж не говоря о том, что оно нафиг никому не нужно, а связывать таблицу с другими надо ID_Rank Int Вид профессии (специалист/рабочий/руководитель) Rank.Id
0
|
||
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|
| 24.03.2017, 10:29 [ТС] | |
|
Приказ об изменении кода профессии, кода, блять, еще какой-нибудь херни подписанный президентом Зимбабве! Какая нахрен разница, какой норм док? Мне нужно как-то обойти ограничение на связи с таблицами!!!! и СВЯЗАТЬ ОДНУ ТАБЛИЦУ С ТРЕМЯ-ЧЕТЫРМЯ СПРАВОЧНИКАМИ И ДРУГИМИ ТАБЛИЦАМИ. Вот в чем вопрос. Если не знаешь так не тролль меня....
0
|
|
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
|
| 24.03.2017, 10:35 | |
|
ну и правь свой id_rank, если президент зимбавбе каждую должность вводит с кодом, и раз в код коды меняет, да только связывай не по этому полю, а по Id-у. С таким же успехом ключом можно и Rank_Name сделать.
Где ты нахватался таких представлений о РСУБД, в той самой зимбаве?
0
|
|
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|
| 24.03.2017, 10:39 [ТС] | |
|
блин... таблица1 имеет связи с другими таблицами (2,3,4,5,6....n) и совершенно похуй по каким полям... Количество связей ограничено двумя полями(таблицами). ПОЧЕМУ? Вот в чем вопрос.....
0
|
|
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
|
| 24.03.2017, 10:51 | |
|
0
|
|
|
224 / 68 / 33
Регистрация: 23.05.2014
Сообщений: 745
|
|
| 24.03.2017, 10:54 [ТС] | |
|
спецификации insert update как выставлены? Без каскадного обновления я тоже их нафигачить могу 1000 связей...
0
|
|
|
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
|
|
| 24.03.2017, 10:55 | |
|
а это против "двум полям"
0
|
|
| 24.03.2017, 10:55 | |
|
Помогаю со студенческими работами здесь
20
Как отключить проверку FOREIGN KEY Добавление NOT NULL FOREIGN KEY в таблицу DDL-триггер для primary и foreign key
Конфликт инструкции ALTER TABLE с ограничением FOREIGN KEY Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|