删除外键关系中的行

时间:2017-08-31 18:27:11

标签: sql sql-server sql-server-2008

我有一个表,我有一个外键约束,如下面

ALTER TABLE [dbo].[Element] WITH CHECK 
    ADD CONSTRAINT [FK_Element_Band] 
    FOREIGN KEY([BandID]) REFERENCES [dbo].[Band] ([BandID])
GO

ALTER TABLE [dbo].[Element] CHECK CONSTRAINT [FK_Element_Band]
GO

现在我正试图从带状表中删除一行

DELETE FROM Band 
WHERE TypeID = 21 AND BandUpperLimit = 10000 AND PID = 61

但是我收到了一个引用约束错误:

  

DELETE语句与REFERENCE约束“FK_Element_Band”冲突。冲突发生在数据库“pricingModified”,表“dbo.Element”,列'BandID'。

所以如果我在Elements表中有任何引用具有ID 21的Band表的内容,那么就会发生这种情况,但自SQL以来情况并非如此

SELECT * 
FROM Element 
WHERE BandID = 21 

什么都不返回。

有人可以告诉我为什么我无法从父表中删除行数据,即使子表中没有引用?

由于

3 个答案:

答案 0 :(得分:1)

请检查此查询:

select b.* 
from Element e
  inner join Band b 
    on e.BandId = b.BandId
where b.TypeId = 21
  and b.BandUpperLimit = 10000 
  and b.PID = 61

答案 1 :(得分:1)

只需在外键约束中指定ON DELETE CASCADE即可。然后,当您从Band表中删除一行时,它将自动删除Element表中的所有子记录。

ALTER TABLE [dbo].[Element] WITH CHECK 
    ADD CONSTRAINT [FK_Element_Band] 
    FOREIGN KEY([BandID]) REFERENCES [dbo].[Band] ([BandID]) ON DELETE CASCADE
GO

答案 2 :(得分:0)

创建子表时

create table <child_table_name>  
(  
_______,  
_______,  
([FOREIGN KEY column_name]) [size of FOREIGN KEY column] references [parent table(primary key column_name)] on delete cascade  
)  

使用此功能,您可以使用删除操作轻松删除fk的记录。
试试这个,如果成功,那就标记为正...