【问题标题】:Delete Multiple rows in several tables删除多个表中的多行
【发布时间】:2023-03-28 12:27:01
【问题描述】:

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

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

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

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

例如,如果我有一个电子邮件地址为 123@gmail.com 的人,并且此人的购物车中有 2 只动物 1 的 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|

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 请展示您的尝试,以便我们对其进行评论或改进。另请注意,Stack Overflow 不是为我编写代码的服务。最后,哪个 DBMS:Oracle?数据库服务器? mysql?等等等等
  • 向您展示表格图片的示例数据?
  • 您是否考虑了参照完整性(也就是具有级联删除功能的“外键”)?

标签: c# html sql database


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多