繁体   English   中英

删除多个表中的多行

[英]Delete Multiple rows in several tables

我在 SQL 数据库中有 3 个表:

  1. 动物状况
  2. 动物
  3. 大车

我希望能够根据购物车从AnimalsAnimal Status表中删除几个项目。

所有表之间的相同之处是 AnimalID,它是所有表中的主键,基于此我应该删除它们。 但同时我需要为拥有特定电子邮件的人删除它。

例如,如果我有一个电子邮件为 123@gmail.com 的人,并且此人的购物车 1 中有 2 只动物,ID 为 123,另一只动物的 ID 为 456,我需要从其他 2 个表中删除这 2 只特定动物。

我知道如何为 1 张桌子做这件事,但当我有几张桌子相互依赖时,根据特定的电子邮件,当购物车中还有其他电子邮件和动物时,我就不知道了。

这是它在外部的工作方式:

x= AnimalStatus.Delete(AdoptCart.GetAnimalId(Session["email"].ToString()).ToString());
            if (x > 0)
            {
                x = Animal.Delete(AdoptCart.GetAnimalId(Session["email"].ToString()).ToString());
                if (x > 0)
                {
                    AdoptCart.RemoveAllbyEmail(Session["email"].ToString());

以下是按工作顺序排列的所有删除代码:

根据动物 ID 删除 AnimalStatus:

static public int Delete(string id)
    {
        int rowsAffected;
        string strSql = string.Format("delete from AnimalStatus where AnimalID='" + id + "'");
        rowsAffected = (int)dataservice.ExecuteNonQuery(strSql);
        return rowsAffected;
    }

根据动物的 ID 从动物表中删除动物:

 static public int Delete(string id)
        {
            int rowsAffected;
            string strSql = string.Format("delete from Animal where AnimalID='" + id + "'");
            rowsAffected = (int)dataservice.ExecuteNonQuery(strSql);
            return rowsAffected;
        }

从购物车表中删除所有动物:

static public int Remove(string AnimalID) 
    {
        int rowsAffected;
        string strSql = string.Format("delete from Cart where AnimalID='" + AnimalID + "'");
        rowsAffected = (int)dataservice.ExecuteNonQuery(strSql);
        return rowsAffected;
    }

这段代码的问题是所有这些只删除了 1 只动物,我需要删除几只。

我曾尝试创建这样的语句,但我没有设法使它起作用。:

Delete Animal.*, AnimalStatus.*

FROM     Animal INNER JOIN
                  AnimalStatus ON Animal.AnimalID = AnimalStatus.AnimalID INNER JOIN
                  Cart ON Animal.AnimalID = Cart.AnimalID
WHERE  (Cart.UserEmail = N'Email')

根据我用文字给出的示例,应该删除的内容如下在//removed标记。

Cart Table
 | AnimalID | Email_Addr |
--------------------------------------
| 123 | 123@gmail.com | //removed
| 456 | 123@gmail.com | //removed
| 765 | jj@gmail.com  |
| 343 | bb@gmail.com  |
| 256 | cc@gmail.com  |

Animal Status Table
 | AnimalID | Vaccinated |
--------------------------------------
| 123 | Yes | //removed
| 456 | Yes | //removed
| 765 | No  |
| 343 | No  |
| 256 | No  |

Animals Tables
 | AnimalID | Age |
--------------------------------------
| 123 | 3 | //removed
| 456 | 4 | //removed
| 765 | 3 |
| 343 | 7 |
| 256 | 10|

看看你目前的工作,你可以做一些事情。 您可以按照您的要求重写查询逻辑,但我在您的示例中没有看到的是主键/外键关系。 因此,级联不适用于您当前设置表格的方式。 这是级联删除的好文章。 级联删除

因此,如果您不想重写所有内容,您真的可以在 C# 代码中完成所有这些操作。 您所要做的就是遍历购物车表并获取所有包含电子邮件“123@gmail.com”的 ID,然后调用您的三个删除语句。 您只需要编写一个方法来获取 id 并调用 delete 方法,直到 id 变量为空。

这仅取决于您希望所有逻辑存在的位置,在 sql 中还是在您的 C# 代码中。 如果您使用实体框架,无论是代码优先还是数据库优先,您都可以选择使用 LINQ 查询语法或扩展方法。 只是真的取决于偏好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM