Удалить из 2 таблиц с ограничениями внешнего ключа

У меня есть 2 таблицы tlbinvoiceи tblRel_Inv_Courseв которых InvoiceIDесть внешний ключ. Когда я попытался удалить строку из Invoiceтаблицы, я получаю сообщение об ошибке

Не удается удалить ограничение внешнего ключа

Ниже приведены два запроса и данные:

 select * from  invoice where InvoiceID=19

    InvoiceID   invimagetype  location
    -----------------------------------
    19          image/jpeg    network


 select * from  Rel_Inv_Course where CourseID=4262 

    Rel_I_C_ID  CourseID    InvoiceID
    ----------------------------------
    2255        4262            19

То, что я пробовал:

delete from [TAP].[dbo].Invoice 
where InvoiceID = (select InvoiceID 
                   from Rel_Inv_Course 
                   where CourseID = 4262)

delete from Rel_Inv_Course 
where CourseID = 4262

Но я не могу этого сделать. Мне нужно удалить из обеих строк таблицы с идентификатором счета как 19. Пожалуйста, помогите.

sql,sql-server,

0

Ответов: 2


4 принят

Поскольку в комментариях сказано, что все, что вам нужно сделать, это перевернуть ваши заявления об удалении, и вы должны быть хорошими:

Вы можете подумать о том, чтобы сокрушить их в начале транса, чтобы вы могли проверить, что ваши удаления удаляют только те данные, которые вы хотите:

  Begin Tran
    DECLARE @INVOICEID INT
    SET @INVOICE = (select InvoiceID from Rel_Inv_Course where CourseID=4262)

        delete from Rel_Inv_Course where CourseID=4262

        delete from [TAP].[dbo].Invoice where InvoiceID =(@INVOICEID)

    --Select * from Rel_Inv_Course 
    --Select * from [dbo].Invoice 

    --If satisfied with deletes finally commit tran
    --If not satisfied --> Rollback Tran
    Commit Tran

0

Это может быть проще объяснить с помощью некоторых выборочных данных и DDL:

USE Sandbox;
GO

CREATE TABLE dbo.Parent (ID int NOT NULL,
                         SomeString varchar(100) NOT NULL);
GO
CREATE TABLE dbo.Child (ID int NOT NULL,
                        ParentID int NOT NULL,
                        AnotherString varchar(100) NOT NULL);
GO
ALTER TABLE dbo.Parent ADD CONSTRAINT PK_PID PRIMARY KEY CLUSTERED (ID);

ALTER TABLE dbo.Child ADD CONSTRAINT PK_CID PRIMARY KEY CLUSTERED (ID);

ALTER TABLE dbo.Child
ADD CONSTRAINT FK_PID
    FOREIGN KEY (ParentID)
    REFERENCES dbo.Parent (ID);
GO

INSERT INTO dbo.Parent (ID,
                        SomeString)
VALUES (1, 'sdfkgjbhasdfg'),
       (2, 'sdfkjsdbhkf');
GO
INSERT INTO dbo.Child (ID,
                       ParentID,
                       AnotherString)
VALUES (1, 1, 'asdfkiashjbd'),
       (2, 1, '#asldjasbhdk,'),
       (3, 2, 'asfjasdfj');
GO

--Try to delete a row in Parent:
DELETE FROM dbo.Parent
WHERE ID = 2;
--No surprise it failed
GO
--Try to delete a row in child
DELETE FROM dbo.Child
WHERE ID = 2;
--This worked fine.
GO
--
--If we check, however, ParentID 1 and 2 are still in the table:
SELECT *
FROM dbo.Child;
--We want to delete ID 1 in parent, so we need to delete the other row
DELETE FROM dbo.Child
WHERE ParentID = 1;
--Now delete in Parent
DELETE FROM dbo.Parent
WHERE ID = 1;
GO
DROP TABLE dbo.Child;
DROP TABLE dbo.Parent;

Вы заметите, что первое удаление Parentне выполнено, поскольку оно конфликтует с ограничением внешнего ключа. Однако после удаления всех строк в дочернем элементе для этого идентификатора вы можете удалить родительскую строку.

Эта же логика применяется к вашим данным. Сначала удалите соответствующие строки в дочерней таблице, а затем удалите данные в родительской таблице. В качестве альтернативы, выполните каскадирование, а затем вам просто нужно удалить строку в родительском элементе, а удаление будет каскадом вниз.

SQL, SQL-сервер,
Похожие вопросы