У меня есть 3 таблицы в базе данных SQL:
Я хочу иметь возможность удалять несколько элементов из таблиц Животные и Статус животных на основе корзины.
То же самое между всеми таблицами - это 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|
Пожалуйста, покажите, что вы пробовали, чтобы мы могли прокомментировать или улучшить это. Также обратите внимание, что Stack Overflow не является сервисом для написания кода для меня. Наконец, какая СУБД: Oracle? SQL-сервер? MySql? и т. д. и т. д.
Образцы данных, как при показе вам изображений таблиц?
Вы учли ссылочную целостность (иначе говоря, «внешние ключи» с каскадным удалением)?
@Cheyenne, образцы данных будут структурой всех задействованных таблиц и запросом, который вы используете для удаления строк из одной из таблиц.
Покажите, пожалуйста, структуру таблиц. Используйте операторы CREATE TABLE для этих образов НЕТ. Также предоставьте образцы данных для таблиц (в виде операторов INSERT INTO, снова изображения НЕТ) и желаемые данные для этого образца (в виде текста и, как вы уже догадались, изображений НЕТ).
@Cheyenne, также взгляните на Внешние ключи, упомянутый Пси. Обычно вы хотите структурировать таблицы таким образом, чтобы любая удаляемая строка Животные также вызывала удаление любых «ссылок».
Я отредактировал сообщение, чтобы, надеюсь, лучше его понять. Я действительно не понял структуру внешнего ключа в примере в предоставленной ссылке, будет ли дочерний столбец в моем случае AnimalD?
Вы можете использовать Каскад. В таких движках, как mysql, например, когда вы добавляете Foreing Key, вы можете определить действие удаления как «каскадное», поэтому, если запись в этой таблице была удалена, она автоматически «каскадирует» удаление записи на другой таблица, указанная во внешнем ключе. При этом вам нужно будет удалить запись только в таблице, а все остальное сделает движок.





Глядя на вашу текущую работу, вы можете сделать несколько вещей. Вы можете переписать свою логику запроса, как вы спрашиваете, но то, что я не вижу в вашем примере, - это отношения первичного / внешнего ключа. Таким образом, каскад не будет работать с тем, как у вас в настоящее время настроены таблицы. Это хорошее описание каскадного удаления. Каскадное удаление
Так что, если вы не хотите все переписывать, вы действительно можете просто сделать все это в своем коде C#. Все, что вам нужно сделать, это пройтись по таблице корзины и получить все идентификаторы с адресом электронной почты «[email protected]» и вызвать ваши три оператора удаления. Вам просто нужно написать метод для получения идентификатора и вызова методов удаления до тех пор, пока переменная идентификатора не станет пустой.
Это просто зависит от того, где вы хотите, чтобы вся логика существовала, в sql или в вашем коде C#. Если вы используете Entity Framework, будь то сначала код или сначала база данных, у вас есть варианты использования синтаксиса запроса LINQ или методов расширения. Просто зависит от предпочтений.
Примеры данных и желаемые результаты действительно помогут.