Удалить несколько строк в нескольких таблицах

У меня есть 3 таблицы в базе данных SQL:

  1. Статус животных
  2. Животные
  3. Корзина

Я хочу иметь возможность удалять несколько элементов из таблиц Животные и Статус животных на основе корзины.

То же самое между всеми таблицами - это AnimalID, который является первичным ключом во всех таблицах, и на основании этого я должен их удалить. Но в то же время мне нужно удалить его для кого-то с конкретным адресом электронной почты.

Пример: у меня есть кто-то с адресом электронной почты [email protected], и у этого человека в тележке 2 животных: 1 с идентификатором 123, а другое с идентификатором 456. Мне нужно удалить этих двух животных из двух других таблиц.

Я знаю, как это сделать для 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());

Вот все коды удаления в порядке их работы:

Удаляет 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;
    }

Удаляет животное из таблицы животных на основе идентификатора животного:

 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;
    }

Проблема с этим кодом в том, что все это удаляет только одно животное, а мне нужно удалить несколько.

Я пробовал создать подобное утверждение, но мне не удалось заставить его работать:

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 | [email protected] | //removed
| 456 | [email protected] | //removed
| 765 | [email protected]  |
| 343 | [email protected]  |
| 256 | [email protected]  |

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|

Примеры данных и желаемые результаты действительно помогут.

Gordon Linoff 06.06.2018 13:32

Пожалуйста, покажите, что вы пробовали, чтобы мы могли прокомментировать или улучшить это. Также обратите внимание, что Stack Overflow не является сервисом для написания кода для меня. Наконец, какая СУБД: Oracle? SQL-сервер? MySql? и т. д. и т. д.

Peter B 06.06.2018 13:34

Образцы данных, как при показе вам изображений таблиц?

Cheyenne 06.06.2018 13:34

Вы учли ссылочную целостность (иначе говоря, «внешние ключи» с каскадным удалением)?

Psi 06.06.2018 13:34
stackoverflow.com/questions/14167696/…
Mark 06.06.2018 13:35

@Cheyenne, образцы данных будут структурой всех задействованных таблиц и запросом, который вы используете для удаления строк из одной из таблиц.

r41n 06.06.2018 13:42

Покажите, пожалуйста, структуру таблиц. Используйте операторы CREATE TABLE для этих образов НЕТ. Также предоставьте образцы данных для таблиц (в виде операторов INSERT INTO, снова изображения НЕТ) и желаемые данные для этого образца (в виде текста и, как вы уже догадались, изображений НЕТ).

sticky bit 06.06.2018 13:43

@Cheyenne, также взгляните на Внешние ключи, упомянутый Пси. Обычно вы хотите структурировать таблицы таким образом, чтобы любая удаляемая строка Животные также вызывала удаление любых «ссылок».

r41n 06.06.2018 13:47

Я отредактировал сообщение, чтобы, надеюсь, лучше его понять. Я действительно не понял структуру внешнего ключа в примере в предоставленной ссылке, будет ли дочерний столбец в моем случае AnimalD?

Cheyenne 06.06.2018 14:29

Вы можете использовать Каскад. В таких движках, как mysql, например, когда вы добавляете Foreing Key, вы можете определить действие удаления как «каскадное», поэтому, если запись в этой таблице была удалена, она автоматически «каскадирует» удаление записи на другой таблица, указанная во внешнем ключе. При этом вам нужно будет удалить запись только в таблице, а все остальное сделает движок.

William Borgo 06.06.2018 15:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
88
1

Ответы 1

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

Так что, если вы не хотите все переписывать, вы действительно можете просто сделать все это в своем коде C#. Все, что вам нужно сделать, это пройтись по таблице корзины и получить все идентификаторы с адресом электронной почты «[email protected]» и вызвать ваши три оператора удаления. Вам просто нужно написать метод для получения идентификатора и вызова методов удаления до тех пор, пока переменная идентификатора не станет пустой.

Это просто зависит от того, где вы хотите, чтобы вся логика существовала, в sql или в вашем коде C#. Если вы используете Entity Framework, будь то сначала код или сначала база данных, у вас есть варианты использования синтаксиса запроса LINQ или методов расширения. Просто зависит от предпочтений.

Другие вопросы по теме