2012-02-25 2 views
0

У меня здесь есть интересная проблема. У меня есть таблица базы данных MySql, связанная с несколькими другими таблицами. Например, «основная» таблица представляет собой набор учебных материалов вместе со связанными таблицами:Как обновить запись в базе данных MySql с несколькими записями, связанными в других таблицах?

  • Оценки, на которые нацелен материал;
  • Грамматика указывает, что материал лучше всего использовать;
  • Ключевые слова, связанные с материалом

Я хочу, чтобы иметь возможность обновлять и изменять эти записи. Изменение основной записи достаточно просто, но как насчет подключенных записей? Например, предположим, что у меня есть учебный материал, который я изначально собирался учить глаголам и прилагательным, и лучше всего использовать для 1-4 классов. Теперь позже я решил добавить 5 класс в список, удалить 1-й класс и что материал действительно лучше для обучения существительных и прилагательных, но не глаголов.

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

ответ

0

В MySQL вы можете связать свои таблицы с помощью внешних ключей. То есть у вас есть связанные записи, которые разделяют эти ключи. Затем, в зависимости от того, как вы создаете экземпляры своих таблиц, вы можете использовать CASCADE при обновлении значения в одной таблице. Из the manual on MySQL, когда вы определяете этот внешний ключ вы можете установить CASCADE следующим образом:

[CONSTRAINT [symbol]] FOREIGN KEY 
[index_name] (index_col_name, ...) 
REFERENCES tbl_name (index_col_name,...) 
[ON DELETE reference_option] 
[ON UPDATE reference_option] 

reference_option: 
RESTRICT | CASCADE | SET NULL | NO ACTION 

Где:

КАСКАД: Удалить или обновить строку из родительской таблицы и автоматически удалить или обновить соответствующие строки в дочерней таблице. Поддерживаются как ON DELETE CASCADE, так и ON UPDATE CASCADE. Между двумя таблицами не указывайте несколько предложений ON UPDATE CASCADE, которые действуют в одном столбце в родительской таблице или в дочерней таблице.

По умолчанию эта эталонная опция установлена ​​на No Action.

+0

Не забывайте, что внешние ключи работает только с движком InnoDB. – biziclop

+0

@ biz действительно? Ive использовал только оракул, поэтому я не знал, что он не универсален, но в любом случае не является mySQL oracle? – simchona

+0

Нет, механизм 'MyISAM' намного глупее, он абсолютно не совместим с ACID, не имеет внешних ключей, никаких транзакций. – biziclop

0

У меня есть две таблицы, одна называется Vendor, а другой называется Inventory

++++++++++++++ 

+Vendor 

++++++++++++++ 

+Vendor_ID 
+Vendor_Name 

++++++++++++++ 

+++++++++++++++ 

+Inventory 

+++++++++++++++ 

+Description 

+endor_Name 

+Price 

+Weight 

+++++++++++++++ 

В настоящее время VENDOR_NAME в обеих таблицах имеет то же значение, так что я могу сделать

SELECT Vendor.Vendor_ID 
FROM Vendor, Inventory 
WHERE Vendor.Vendor_Name = Inventory.Vendor_Name