Обновление полей в таблице MySQL
У меня есть две таблицы, как показано ниже:
Table A:
home_id; home_name; home_address
Table B:
person_id; person_name; home_id; home_name; home_address
я использую xataface
создать главную страницу для моей базы данных MySQL. Пользователь будет вводить данные в Таблицу B, которые предоставляют person_name и home_id.
Я хочу, чтобы home_name и home_address обновлялись соответственно на основе home_id, введенного в таблицу B, ИЛИ, когда информация в таблице A обновляется. (т.е. пользователю не нужно ничего вводить в home_name и home_address в таблице B)
Должен ли я использовать триггер? Или я должен использовать внешний ключ для этого?
2 ответа
Сначала нормализуйте свои таблицы:-
Table A:
home_id; home_name; home_address
Home_id является первичным ключом
Table B:
person_id; person_name; home_id;
Person_id является первичным ключом, а Home_id является внешним ключом.Home_id в таблице B будет первичным ключом таблицы A.
Вставить записи:-
Шаг 1. Сначала вставьте адрес в таблицу A. Он сгенерирует уникальный Home_id.
Шаг 2. Теперь вставьте reocrd в таблицу B с помощью newluy create home_id в качестве внешнего ключа.
Обновить записи:-
Таблица A. Обновление таблицы A при использовании уникального Home_id
Таблица B. Обновление таблицы B с использованием уникального Person_id
Таблица A и Таблица B. Обновите обе таблицы, используя два отдельных запроса на обновление. Но поместите оба запроса в транзакцию, чтобы сохранить атомарность. http://en.wikipedia.org/wiki/Atomicity_(database_systems)
или используйте запрос ниже:-
UPDATE Table_B JOIN Table_A ON Table_A.home_id = Table_B.home_id
SET Table_A.home_name=<home_name>,
Table_A.home_address= <home_address>,
Table_B.person_name=<person_name>
WHERE Table_B.person_id = <search_contidion>
Здесь есть несколько возможностей:
Используйте триггер afterSave() для таблицы B, чтобы обновить значения таблицы A при сохранении записей B.
function afterSave(Dataface_Record $record){ df_q("replace into `Table B` (`home_id`,`home_name`,`home_address`) values ( '".addslashes($record->val('home_id'))."', '".addslashes($record->val('home_name'))."', '".addslashes($record->val('home_address'))."'); }
Если таблица A является просто вычисляемой таблицей и никогда не должна редактироваться пользователем напрямую, вы можете изменить таблицу A на динамическую таблицу, которая зависит от таблицы B. Подробнее о динамических таблицах здесь
Определение DynamicTable будет выглядеть примерно так:
$tbl = new DynamicTable(
'TableA',
array('CREATE TABLE TableA (
home_id INT(11) not null primary key,
home_name VARCHAR(100),
home_address VARCHAR(255)',
'INSERT INTO TableA (home_id, home_name, home_address) select home_id, home_name, home_address from TableB'
),
'TableB'
);
$tbl->update();
Подходящее место для размещения этого кода находится в вашем методе beforeHandleRequest(), поскольку он вызывается перед каждым запросом, поэтому он гарантирует, что данные Table A всегда будут синхронизированы с Table B при изменении Table B.