我有两张表格如下:
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处输入任何内容)
我应该使用触发器吗?或者我应该使用外键吗?
答案 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)
这里有几种可能性:
使用表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'))."');
}
如果表A只是一个计算表,并且永远不应该由用户直接编辑,那么您可以将表A更改为依赖于表B的动态表。有关动态表的更多信息here < / p>
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保持同步。