Как выполнить редактирование в соединительной таблице - PullRequest
1 голос
/ 13 апреля 2011

Как лучше всего редактировать таблицы соединений?

Items{ItemId, Name, Price...}
Shops{ShopId, Name, Address...}
ItemsInShops{ItemId, ShopId, DeliveryDate...}

Теперь у меня 30 предметов в одном магазине.Я хочу отредактировать этот список и снять 10 элементов и проверить 50 новых элементов.

Я делаю это следующим образом: Удалите все строки из «ItemsInShops» с помощью «ItemId» и добавьте новые значения.Я не думаю, что это хорошее решение.Есть ли лучший способ сделать такое обновление?

Возможно, я не выразил проблему с хорошим примером.Взгляните на это:

User{UserId, Username, Password...}
Roles{RoleId, Name, Description} // Admin, Member, Superuser, Junior etc
UsersInRoles{UserId,RoleId}

Пользователь может иметь любое количество ролей.

John > Admin, Member, Superuser

Это три строки в соединительной таблице 'UserInRoles'.Если я хочу обновить этого пользователя, чтобы он имел следующие роли:

John > Member, Junior

Теперь я делаю это обновление для базы данных следующим образом: я удаляю все роли Джона из таблицы 'UserInRoles' и добавляю новые данные.Я не знаю, есть ли лучший способ сделать это обновление, кроме как удалить все и вставить новое?Что делать, если обновление по какой-то причине не удается (например, потеря интернет-соединения)?

Ответы [ 4 ]

2 голосов
/ 13 апреля 2011

Основываясь на комментариях, нет лучшего способа добавить / удалить данные базы данных, чем добавить / удалить данные базы данных.

В качестве альтернативы, вы можете иметь столбцы в базе данных для информации о состоянии, например,«оплачено», «продано», «дата доставки», «отменено» и т. д. Затем вместо удаления записей вы обновите статус.Это упрощает проверку прошлых транзакций и правильное ведение записей (например, «отмена»).

1 голос
/ 14 апреля 2011

Я не знаю, есть ли лучший способ сделать это обновление, кроме удаления всех и вставки новых?

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

Вы можете удалить только те строки, которые больше не применяются, и вставить только новые строки.Или вы можете обновить значение, которое больше не применяется, значением, которое действительно применяется.

Таким образом, чтобы получить от этого

Name    Role
--
John    Admin
John    Member
John    Superuser

к этому

Name    Role
--
John    Member
John    Junior

Вы можетеудалить то, что больше не применяется.,.

delete from userinroles
where Name = 'John' 
  and (Role = 'Admin' or Role = 'Superuser');

и укажите, что применимо.

insert into userinroles (Name, Role)
values ('John', 'Junior');

Или вы можете обновить значение новым значением.

delete from userinroles
where Name = 'John' 
  and Role = 'Admin';

С последующим

update userinroles
set Role = 'Junior'
where 'Name' = 'John' and Role = 'Superuser';

Вы сказали

Что если обновление по какой-то причине не удастся (например, потеря интернет-соединения)?

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

1 голос
/ 14 апреля 2011

Ваш обновленный вопрос интересен.

Эффективность, удаление и добавление данных может быть сделано с помощью MERGE.

Что касается двух запросов, выполняющихся подряд, когда они действительно формируют один процесс, вам необходимо транзакций . Они являются настройками «все или ничего», так что набор запросов либо все успешные, либо все неудачные (все «откатываются»). Транзакции очень полезны, например, «пользователь платит + продукт доставлен» или «прошлые данные заархивированы + удалены», и они подробно обсуждаются во многих учебниках и на веб-сайтах.

1 голос
/ 13 апреля 2011

Вы можете посмотреть в КНИГАХ онлайн ключевое слово MERGE.

...