加入mysql表与更新多个表

时间:2013-02-15 16:38:52

标签: php mysql join

假设我在mysql中有两个表 1.人(身份证,姓名,姓氏) - Image
2. someothertable(id,name,lastname,action,quantity) - image

我想问一下,如果真的是不好的做法,一次更新两个表?例如,如果有人将Robert Jackson的姓氏更新为“Smith”,则执行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将需要更改一些代码,但是如果正确的话,我已经准备好了。

3 个答案:

答案 0 :(得分:2)

使用join不是数据库有多大的函数,而是关于规范化和数据完整性。您只在一个表中拥有lastname的原因是,无需担心保持值同步。在您的示例中,如果这些调用位于单个事务中,则它们应保持同步。除非其中一个在其他地方被更改,或者在数据库中手动更改。

所以你可以选择这些表:

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

答案 1 :(得分:1)

一个选项是让someothertablelastname中的Person字段上设置外键约束。您可以应用更新触发器,以便自动级联。

以下是一个例子:

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)只需要在一个地方进行更改

希望这会有所帮助。祝你好运!

答案 2 :(得分:1)

您可以使用触发器:Tutorial here

,而不是使用2更新