0

假设我在 mysql 中有两个表。
1. 人(id、name、lastname) -图片
2. someothertable(id、name、lastname、action、数量) -图片

我想问一下,如果它真的很糟糕,一次更新两个表?例如,如果有人将 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将需要更改一些代码,但我已准备好这样做,如果它是正确的做法。

4

3 回答 3

2

使用 ajoin与数据库的大小无关,它与规范化和数据完整性有关。您只能lastname在一张表中使用的原因是无需担心保持值同步。在您的示例中,如果这些调用在单个事务中,那么它们应该保持同步。除非其中一个在其他地方被更改,或者在数据库中手动更改。

因此,您可以选择拥有这些表格:

person (id, name, lastname)
someothertable (id, person_id, action, quantity)
于 2013-02-15T16:42:34.653 回答
1

一种选择someothertablelastnamePerson. 您可以应用更新触发器,使其自动级联。

下面是一个例子:

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一个唯一ID(即PersonID)。现在,在您引用的所有其他表中,您person通过唯一 ID 引用它们。这增加了许多优点:

1) 保持数据规范化 2) 保持数据完整性 3) 无需更新、触发器或级联 4) 只需要在一个地方进行更改

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

于 2013-02-15T16:41:23.907 回答
1

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

于 2013-02-15T16:41:39.663 回答