Оператор INSERT конфликтовал с проблемой ограничения FOREIGN KEY - PullRequest
0 голосов
/ 04 июля 2019

У меня есть скрипт ниже, который выдает мне ошибку: «Оператор INSERT конфликтует с ограничением FOREIGN KEY« FK_dbo.PlanShiftAssignments_dbo.User_UserId ». Конфликт произошел в базе данных« SWS », таблица« dbo.User », столбец'Id'. Оператор завершен. "

Как вы можете видеть, в предложении WHERE я проверяю, существует ли UserId в dbo.User.Каковы другие возможные причины ошибки?

ОБНОВЛЕНО: Я также хочу знать, какая строка в операторе выбора вызывает ошибку.Будем благодарны за любые советы по отладке этого запроса.Я использую MS SQL Server Management Studio.

CREATE TABLE [dbo].[PlanShiftAssignments] (
    [PlanShiftId] [uniqueidentifier] NOT NULL,
    [Status] [int] NOT NULL,
    [UserId] [int],
    CONSTRAINT [PK_dbo.PlanShiftAssignments] PRIMARY KEY ([PlanShiftId])
)
CREATE INDEX [IX_PlanShiftId] ON [dbo].[PlanShiftAssignments]([PlanShiftId])
CREATE INDEX [IX_UserId] ON [dbo].[PlanShiftAssignments]([UserId])
ALTER TABLE [dbo].[PlanShiftAssignments] ADD CONSTRAINT [FK_dbo.PlanShiftAssignments_dbo.PlanShifts_PlanShiftId] FOREIGN KEY ([PlanShiftId]) REFERENCES [dbo].[PlanShifts] ([Id])
ALTER TABLE [dbo].[PlanShiftAssignments] ADD CONSTRAINT [FK_dbo.PlanShiftAssignments_dbo.User_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User] ([Id])
insert into dbo.PlanShiftAssignments
                    select ps.Id as PlanShiftId, ISNULL(ps.AssigneeId, psi.UserId) as UserId, ISNULL(psi.[Status], 1) as [Status] from dbo.PlanShifts ps
                    left join 
                    dbo.PlanShiftInvitations psi
                    on ps.Id = psi.PlanShiftId
                    where (psi.UserId is not null and psi.UserId IN (select Id from dbo.[User])) 
                    or (ps.AssigneeId is not null and ps.AssigneeId IN (select Id from dbo.[User]))

Ответы [ 3 ]

3 голосов
/ 04 июля 2019

Убедитесь, что вы всегда включаете список столбцов цели в каждый оператор INSERT.

insert into dbo.PlanShiftAssignments (
    PlanShiftId,
    UserId,
    Status)
SELECT
    ps.Id as PlanShiftId, 
    ISNULL(ps.AssigneeId, psi.UserId) as UserId, 
    ISNULL(psi.[Status], 1) as [Status]
...

Ваша таблица создается с порядком PlanShiftId, Status, UserId и порядком столбцов изваш текущий SELECT равен PlanShiftId, UserId, Status, отсюда и путаница.

1 голос
/ 04 июля 2019

У вас странная модель данных, если UserId и AssigneeId еще не ссылаются на User в базовых таблицах.

В любом случае ваше where предложение

where (psi.UserId is not null and psi.UserId IN (select Id from dbo.[User])) or
      (ps.AssigneeId is not null and ps.AssigneeId IN (select Id from dbo.[User]))

Это оставляет открытой возможность того, что psi.UserId соответствует, но ps.AssigneeId нет.

Чтобы убедиться, что логика совпадает, используйте то же выражение, что и в select:

where coalesce(ps.AssigneeId, psi.UserId) in (select Id from dbo.[User])
0 голосов
/ 04 июля 2019

Это может быть связано с тем, что вы указали ИЛИ в своем предложении WHERE, поэтому либо AssigneeId, либо UserId находится в таблице User, но не другой, и, следовательно, делает недействительным ограничение FK.

...