2013-02-15 118 views
0

可以说我在mysql中有两个表。
1人(ID,姓名,姓) - Image
2. someothertable(ID,姓名,姓氏,行动,数量) - 我想问问image加入mysql表与更新多个表

,如果它真的是不好的做法,同时更新桌子一次?例如,如果有人更新罗伯特·杰克逊的姓氏“史密斯”然后做2个查询:

mysql_query("UPDATE person SET lastname = '$lastname' WHERE id = '$id'"); 
mysql_query("UPDATE someothertable SET lastname = '$lastname' WHERE name = '$name' AND lastname = '$oldlastname'"); 

假设现在,你不会满足2个相同名字和姓氏(它只是一个例子)。 是否推荐当从表格中显示数据时加入这两个表格,并且仅在person表格中更改姓氏?

之前我没有必要使用join(从来没有足够的数据库),我只是开始怀疑是否有另一种方法来做到这一点(比2个查询)。使用join将需要更改一些代码,但我准备好了,如果它正确的话。

+1

我建议你阅读本:http://en.wikipedia.org/wiki/Database_normalization – Ranty 2013-02-15 16:41:34

+0

我会推荐一个存储过程 – jcho360 2013-02-15 16:42:09

回答

2

使用join是不是你的数据库有多大的功能,它是关于标准化和数据完整性。只有一张表中有lastname的原因是,不需要担心保持值同步。在你的例子中,如果这些调用是在单个事务中,那么它们应该保持同步。除非其中一个在别处更改,或者在数据库中手动更改。

所以你的选择是有这些表:

person (id, name, lastname) 
someothertable (id, person_id, action, quantity) 
1

一种选择是使someothertable对的lastname字段具有外键约束。您可以应用更新触发器,以便自动级联。

这里是下面的例子:

Alter table someothertable add constraint foreign key (lastname) references Person (lastname) on delete cascade on update cascade; 

这方面的一个通用版本可在下面看到:

Alter table [table-name] add constraint foreign key (field-in-current-table) references [other-table-name] (field-in-other-table) on delete cascade on update cascade; 

这可以以任何表被应用于任何领域。然后,您可以将触发器设置为适合您。 Here是参考链接。

您是否考虑过正常化?

另一种选择是为Person表中的每个person分配唯一的ID(即PersonID)。现在在你参考person的所有其他表格中,你可以通过唯一的ID来引用它们。这增加了许多优点:

1)它使数据规范化 2)保持数据完整性 3)无需更新,触发器或级联 4)的变化将只在一个地方

要求

希望这有助于。祝你好运!

1

而不是使用2更新,您可以使用触发器:Tutorial here