Sql server 使用内部联接删除

Sql server 使用内部联接删除,sql-server,sql-delete,Sql Server,Sql Delete,我遵循了如何从以下位置执行删除: 我要删除的数据: select * from com.Address a inner join com.Contact as c on c.AddressId = a.AddressId inner join cqt.CQMTrainer as t on t.ContactId = c.ContactId select from com.Contact c inner join cqt.CQMTrainer as t on t.Contac

我遵循了如何从以下位置执行删除:

我要删除的数据:

  select * from com.Address a
  inner join com.Contact as c on c.AddressId = a.AddressId
  inner join cqt.CQMTrainer as t on t.ContactId = c.ContactId


 select from com.Contact c
  inner join cqt.CQMTrainer as t on t.ContactId = c.ContactId 
以下是我试图执行的删除操作:

  delete a from com.Address a
  inner join com.Contact as c on c.AddressId = a.AddressId
  inner join cqt.CQMTrainer as t on t.ContactId = c.ContactId

  delete c from com.Contact c
  inner join cqt.CQMTrainer as t on t.ContactId = c.ContactId 
但是,一旦执行它们,就会出现一些外键错误:

DELETE语句与引用约束冲突 “FK_com.Contact_com.Address_AddressId”。冲突发生在 数据库“”,表“com.Contact”,列“AddressId”


我在错误地遵循什么?我甚至尝试添加
begintransaction
commit transaction

查看您的查询您的关系已配置为在您尝试删除另一条记录引用的记录时引发异常。如果要避免这种情况,必须选择数据库服务器应如何处理这种情况。这是在参考属性上设置的。如果您使用的是SQL Server Management Studio,则:

  • 用鼠标右键单击表格,选择“设计”
  • 然后是定义了关系的列(它将 将其显示为行)
  • 然后用鼠标右键单击该列 如果您感兴趣,请选择“关系”
  • 然后在左侧窗格中按名称查找关系,单击它
  • 然后在右侧窗格中,您将看到sea的“插入和更新” “规范”组,展开它
  • 然后你会发现两个规则,一个用于更新,一个用于删除,你可以 可以选择:

    • 无操作-抛出与您的情况类似的异常
    • 级联-删除引用行
    • Set Null-将在通过FK值引用此行的行中设置Null
    • 设置默认值-将为该列设置默认值
  • 如果您没有使用这样的编辑器,可以通过在

    REFERENCES TableName ColumnName
    
    价值观,如:

    ON DELETE  { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
    

    如果你用另一种方式做呢:

    delete c from com.Contact c
    inner join cqt.CQMTrainer as t on t.ContactId = c.ContactId 
    
    delete a from com.Address a
    inner join com.Contact as c on c.AddressId = a.AddressId
    inner join cqt.CQMTrainer as t on t.ContactId = c.ContactId
    
    • 首先,您将删除联系人表上的信息,因为出现错误
      表示您在联系人上有地址id的引用,这就是为什么您不能先删除地址表

    我认为是外键阻止您删除这些记录。您应该从其他表中删除记录firstContact是Address的父级。我正试图删除他们两个。首先是地址,然后是父地址。因此,从技术上讲,我正在从其他表中删除记录?@J.Doe如果您有要在cascade上删除的外键设置,那么它当然也会从其他表中删除。如果不是这样,则会发生您正在得到的错误。看这个。如果你不想修改外键,那么你需要先从另一个表中删除。好的,我想我现在就知道了。thanks@J.Doe,更改删除顺序。首先从引用地址表的联系人表中删除(这就是为什么首先从地址中删除会导致错误),然后删除地址。还有一种可能性是,其他一些记录仍会引用您试图删除的地址。在这样的ddl问题的答案中看到点击按钮的场景是非常罕见的。)这是一个非常基本的问题,需要在这里解决,所以我认为解决方案也应该很容易实现。我知道很多人一开始都在使用gui来处理SQL Server。如果有人熟悉,我还添加了脚本部分。在你看来这是个糟糕的答案吗?