更新MySQL表中的字段

时间:2014-12-31 06:35:20

标签: mysql xataface

我有两张表格如下:

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。

我希望根据表B中输入的home_id相应地更新home_name和home_address,或者更新表A中的信息。 (即用户不需要在表B中的home_name和home_address处输入任何内容)

我应该使用触发器吗?或者我应该使用外键吗?

2 个答案:

答案 0 :(得分:0)

首先规范你的表格: -

Table A:
home_id; home_name; home_address

Home_id是主键

Table B: 
person_id; person_name; home_id;

Person_id是主键& Home_id是外键。表B中的Home_id将是表A的主键。

插入记录: -

第1步。在表A中首先插入地址。它将生成唯一的Home_id。

第2步。现在在表B中插入reocrd,使用ulu newluy create home_id作为外键。

更新记录: -

表A. 使用唯一的Home_id

更新表A.

表B. 使用唯一的Person_id

更新表B.

表A&表B. 使用两个单独的更新查询更新两个表。但是将两个查询放在一个Transaction中以保持原子性。 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 :(得分:0)

这里有几种可能性:

  1. 使用表B的afterSave()触发器在保存B记录时更新表A值。

    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的动态表。有关动态表的更多信息here < / p>

  3. 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()方法中,因为在每个请求之前调用它,因此它将确保TableB数据在TableB更改时始终与TableB保持同步。