Обновление полей в таблице 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>

Здесь есть несколько возможностей:

  1. Используйте триггер 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'))."');
    }
    
  2. Если таблица 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.

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