繁体   English   中英

加入mysql表与更新多个表

[英]Joining mysql tables vs updating multiple tables

可以说我在mysql中有两个表。
1.人(身份证,姓名,姓氏)- 图片
2. someothertable(ID,名称,姓氏,操作,数量)- 图片

我想问一下,如果真的是不好的做法,一次更新两个表吗? 例如,如果有人将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将需要一些代码更改,但是,如果它做对了,我已经准备好做。

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

因此,您可以选择以下表格:

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

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

下面是一个示例:

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;

可以将其应用于任何表中的任何字段。 然后,您可以将触发器设置为适合您的触发器。 是参考链接。

您是否考虑过标准化?

另一个选择是为Person表中的每个person分配一个uniqueID(即PersonID )。 现在,在所有其他表格中,您引用的person通过唯一ID引用的。 这增加了许多优点:

1)保持数据规范化2)保持数据完整性3)不需要更新,触发器或级联4)仅需在一个位置进行更改

希望这可以帮助。 祝你好运!

除了使用2更新,您还可以使用trigger: 此处的教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM