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

Откуда:
Сообщений: 740
мне нужно сделать апдейт в подчиненной таблице Initiator
Я занимаюсь апдейтом данных в подчиненных таблицах. Везде все хорошо обновлялось (аналогичные вторичные таблицы) пока не дошла до обновления таблицы, имеющей внешний ключ со справочной таблицей

таблица Initiator - назначение, котороую обновляю
автор
InitiatorID AdminUnit Initiator
1 Отдел1 Иванов
2 Отдел2 Петров
3 Отдел2 Сидоров
4 Отдел3 Хорев


таблица Zadan - источник откуда беру данные для апдейта
автор
Shifr Otdeli
1 Отдел1
2 Отдел2
3 Отдел3


Промежуточная таблица Job с полем для сравнения shifr для связи таблицы источника и назначения
автор
Shifr InitiatorID
1 1
2 1
3 2


пишу апдейт на замену

update Initiator
set
Initiator.adminUnit=zadan.otdeli
from zadan, Job  
LEFT OUTER JOIN Initiator on Job.initiatorId=Initiator.initiatorId
Where zadan.shifr=Job.shifr  

автор
Сообщение 547, уровень 16, состояние 0, строка 1
The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_Initiator_AdminUnit". The conflict occurred in database "DB", table "dbo.AdminUnit", column 'adminUnit'.
The statement has been terminated.


AdminUnit это справочная таблица и выглядит так и в ней хранятся всего 15 справочных записей - названия отделов
автор
adminUnitId adminUnit
1 Отдел1
2 Отдел2
3 Отдел3
...
15 Отдел15


Есл иназать на ЗАВИСИМОСТИ таблицы AdminUnit, то показываются таблицы от которых зависят остальные
17 авг 11, 11:21    [11131321]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104751
И что вам непонятно из сообщения об ошибке ?
17 авг 11, 11:26    [11131354]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
select
  [Что было]     = Initiator.adminUnit
  ,[Что станет]  = zadan.otdeli
from zadan, Job  
LEFT OUTER JOIN Initiator on Job.initiatorId=Initiator.initiatorId
Where zadan.shifr=Job.shifr  
Смотрите и делайте выводы.
17 авг 11, 11:27    [11131364]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
from zadan, Job  
LEFT OUTER JOIN Initiator on Job.initiatorId=Initiator.initiatorId
Where zadan.shifr=Job.shifr  

И опять смешение стилей
Может sql - это не ваше ?
17 авг 11, 11:32    [11131410]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Ольга Семенова
from zadan, Job


В вашем прошлом топике я уже писал вам про ЗАПЯТУЮ. И другие писали, что я писал.
Но вы ж в основном пишете, а не читаете.
17 авг 11, 12:00    [11131691]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
SamMan
Ольга Семенова
from zadan, Job


В вашем прошлом топике я уже писал вам про ЗАПЯТУЮ. И другие писали, что я писал.
Но вы ж в основном пишете, а не читаете.


а как тогда перечислять источник таблиц?
17 авг 11, 13:07    [11132445]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
Гавриленко Сергей Алексеевич
select
  [Что было]     = Initiator.adminUnit
  ,[Что станет]  = zadan.otdeli
from zadan, Job  
LEFT OUTER JOIN Initiator on Job.initiatorId=Initiator.initiatorId
Where zadan.shifr=Job.shifr  
Смотрите и делайте выводы.


все отлично видно что мне нужно заменить
но почему тогда не дает ключ этого сделать через обновление?

update Initiator set
   Initiator.adminUnit= zadan.otdeli
from zadan, Job  
LEFT OUTER JOIN Initiator on Job.initiatorId=Initiator.initiatorId
Where zadan.shifr=Job.shifr  
17 авг 11, 13:15    [11132533]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
но почему тогда не дает ключ этого сделать через обновление?

Наверное потому, что это обновление нарушает это ограничение
Вы не думали о такой очевидной причине ?
17 авг 11, 13:18    [11132557]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Ваш апдейт равносилен такому:

update Initiator set NULL= zadan.otdeli
from zadan 
Нет ощущения что что-то не так?
17 авг 11, 13:58    [11132933]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Ольга Семенова
а как тогда перечислять источник таблиц?


через-JOIN-и-его-опции
17 авг 11, 14:32    [11133261]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
Glory
Ольга Семенова
from zadan, Job  
LEFT OUTER JOIN Initiator on Job.initiatorId=Initiator.initiatorId
Where zadan.shifr=Job.shifr  

И опять смешение стилей
Может sql - это не ваше ?


просто такое мне подсказали тут 11089489
я вот так и обновляю все дочерние таблицы, которые с источником имеютя связь через промежуточную таблицу
17 авг 11, 20:48    [11135940]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Ольга Семенова,

на данном этапе запомните главное:

НИКОГДА НЕ ПИШИТЕ ИМЕНА ТАБЛИЦ ЧЕРЕЗ ЗАПЯТУЮ! :)
17 авг 11, 21:07    [11136033]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Ольга Семенова
Glory
пропущено...

И опять смешение стилей
Может sql - это не ваше ?


просто такое мне подсказали тут 11089489
я вот так и обновляю все дочерние таблицы, которые с источником имеютя связь через промежуточную таблицу
Не нашёл в той теме такой совет...
17 авг 11, 21:07    [11136036]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 740
Уленшпигель
Ольга Семенова,

на данном этапе запомните главное:

НИКОГДА НЕ ПИШИТЕ ИМЕНА ТАБЛИЦ ЧЕРЕЗ ЗАПЯТУЮ! :)


это теперь поняла на селектах. Крос жоин получиться оказывается
17 авг 11, 21:42    [11136207]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Ольга Семенова
это теперь поняла на селектах. Крос жоин получиться оказывается

в том, что получится cross join, нет ничего военного, но от соединения через "," следует отказаться
18 авг 11, 11:06    [11137914]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
это теперь поняла на селектах. Крос жоин получиться оказывается

Тут как раз нет никакого кроссджойна
18 авг 11, 11:10    [11137979]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Зайцев Фёдор
в том, что получится cross join, нет ничего военного, но от соединения через "," следует отказаться

Интересно, это официальная рекомендация майкрософта?
18 авг 11, 11:26    [11138186]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
igor2222
Зайцев Фёдор
в том, что получится cross join, нет ничего военного, но от соединения через "," следует отказаться

Интересно, это официальная рекомендация майкрософта?
Нет. Но трудности почти обеспечены: 11127104
Области видимости таблиц в списке через запятую и в JOINах - разные. Во FROMе, я имею в виду.
18 авг 11, 11:38    [11138309]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Ну понятно, что мелкософт "убрал" *= с целью упрощения себе жизни и если смешивать всё до кучи- то получим разные области видимости (возможно). Но для тех, кто перешел с Оракла например, и для кого (+) - привычное дело- могут писать запросы с ",", которые более читабельны (следствие элементарной путаницы например при написании CROSS JOIN-ов). За смешивание стилей конечно надо бить по рукам, но писать ВСЁ через запятую - вполне логичное решение и часто оправданное.
18 авг 11, 11:57    [11138496]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
igor2222
Ну понятно, что мелкософт "убрал" *= с целью упрощения себе жизни и если смешивать всё до кучи- то получим разные области видимости (возможно). Но для тех, кто перешел с Оракла например, и для кого (+) - привычное дело- могут писать запросы с ",", которые более читабельны (следствие элементарной путаницы например при написании CROSS JOIN-ов). За смешивание стилей конечно надо бить по рукам, но писать ВСЁ через запятую - вполне логичное решение и часто оправданное.


Вот есть пример, в котором один из джойнов закомментирован в целях отладки запроса:
SELECT *
FROM master..spt_values v1
--JOIN master..spt_values v2 ON v1.number=v2.number AND v2.type='p'
JOIN master..spt_values v3 ON v1.number=v3.number AND v3.type='p'
WHERE v1.type='p'
Столь ли просто будет повторить такое же исключение джойна, в случае синтаксиса через запятую? Я вижу, что при самом лучшем раскладе это выглядеть будет типа такого:
SELECT *
FROM master..spt_values v1
--,master..spt_values v2
,master..spt_values v3
WHERE v1.type='p'
--AND v1.number=v2.number AND v2.type='p'
AND v1.number=v3.number AND v3.type='p'
Необходимость комментировать блоки в двух разных местах это уже плохо. Повышается вероятность ошибки. Не вижу оправданности синтаксиса через запятую, за исключением кросс-джойнов (в таком случае есть некая экономия на кол-ве буковок).
18 авг 11, 12:11    [11138644]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
Glory
Member

Откуда:
Сообщений: 104751
igor2222
Но для тех, кто перешел с Оракла например, и для кого (+) - привычное дело- могут писать запросы с ",", которые более читабельны

"Более читабельны" - это когда сначала в списке from ищешь таблицу, а потом где-то в "простыне" where условия соединения. И только через полчаса понимаешь, что для этой таблицы как раз никаких условий соединения нет
Все это читабельнее CROSS JOIN ?
18 авг 11, 12:15    [11138687]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
aleks2
Guest
kDnZP
Не вижу оправданности синтаксиса через запятую, за исключением кросс-джойнов (в таком случае есть некая экономия на кол-ве буковок).


Ни нада экономить на букофках - тады есть шанс, что хоть сам пишущий понимает шо он пишет.
18 авг 11, 12:16    [11138692]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
aleks2
kDnZP
Не вижу оправданности синтаксиса через запятую, за исключением кросс-джойнов (в таком случае есть некая экономия на кол-ве буковок).


Ни нада экономить на букофках - тады есть шанс, что хоть сам пишущий понимает шо он пишет.

Дык я и не пишу))). Про исключение имел в виду нечто подобное:
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT 1)) n FROM master..spt_values v1, master..spt_values v2, master..spt_values v3
Но это редкие и единичные случаи.
18 авг 11, 12:31    [11138816]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
igor2222
которые более читабельны
Нечитаемость джойнов часто вызвана странным стилем, которые некоторые любят - писать слово JOIN в предыдущей строке.
SELECT *
FROM master..spt_values v1 JOIN 
  master..spt_values v2 ON v1.number=v2.number AND v2.type='p' JOIN 
  master..spt_values v3 ON v1.number=v3.number AND v3.type='p'
WHERE v1.type='p'
Лучьше такой стиль, всё прозрачно:
SELECT *
FROM master..spt_values v1 
    JOIN master..spt_values v2 
        ON v2.number=v1.number 
        AND v2.type='p' 
    JOIN master..spt_values v3 
        ON v3.number=v1.number 
        AND v3.type='p'
WHERE v1.type='p'
Сразу видно, что, с чем и как :-)
18 авг 11, 12:40    [11138908]     Ответить | Цитировать Сообщить модератору
 Re: Обновление не дает FOREIGN KEY  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
alexeyvg, ну у меня вообще автоформатер стоит редгейтовский (prompt), он как раз настроен подобным образом. Правда напрягает, что в нем так не хватает любимого мною варианта растановки запятых типа:
SELECT  v1.name
        ,v1.number
        ,v1.type
        --,v1.low
        --,v1.high
        ,v1.status
FROM    master..spt_values v1
Что опять же, позволяет быстро добавлять, комментировать, исключать поля. Но с этим можно смириться))).
18 авг 11, 12:49    [11139010]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить