假设我在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
将需要更改一些代码,但是如果正确的话,我已经准备好了。
答案 0 :(得分:2)
使用join
不是数据库有多大的函数,而是关于规范化和数据完整性。您只在一个表中拥有lastname
的原因是,无需担心保持值同步。在您的示例中,如果这些调用位于单个事务中,则它们应保持同步。除非其中一个在其他地方被更改,或者在数据库中手动更改。
所以你可以选择这些表:
person (id, name, lastname)
someothertable (id, person_id, action, quantity)
答案 1 :(得分:1)
一个选项是让someothertable
在lastname
中的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更新