场景:我的用户希望能够更改他们的用户名(不幸的是,我在启动站点时没有考虑添加此功能),但 MySQL 数据库有 110 个表。
我是否只需要编写一个执行 110 个查询的脚本来更新每个表中的用户名(并记住在添加新表时更新脚本),还是有办法链接所有表中的字段,所以更新一个表中的用户名会更新所有其他表中的用户名吗?
我假设您使用用户名作为主键,因为您已经看到需要这样做。更改表结构以使用 auto_increment ID 作为主键而不是用户名,并从其他表中引用 ID,而不是直接引用名称。这可以防止跨表的用户名重复,并允许您通过仅更新单个表来更改用户名。
请注意,您可能希望在用户名本身上保留一个唯一索引以防止重复:目前,您可以通过使用名称作为 PK 来“免费”获得它,并且您可以继续让数据库通过创建新索引来管理它.
您可以设置表进行级联更新。
这是通过使用外键和ON UPDATE CASCADE
这是一篇很好的文章:http ://www.oreillynet.com/onlamp/blog/2004/10/hey_sql_fans_check_out_foreign.html
以及官方 MySQL 页面: http ://dev.mysql.com/doc/refman/5.1/en/ansi-diff-foreign-keys.html
不幸的是,这仅适用于 InnoDB,因此您必须切换表。
您可以将外键约束与ON UPDATE CASCADE一起使用,以便在修改外键时自动更新外键(仅限 InnoDB)。
但最好不要将用户名用作外键。您通常应该使用代理键作为外键,这样就不会出现问题。