场景:我的用户希望能够更改用户名(不幸的是,当我启动网站时,我没有考虑添加此功能),但MySQL数据库有110个表。
我是否必须制作一个执行110个查询的脚本来更新每个表中的用户名(并记得在添加新表时更新脚本),或者是否有办法链接所有字段中的字段这些表,所以在一个表中更新用户名会在其他所有表中更新吗?
答案 0 :(得分:1)
我假设您使用用户名作为主键,因为您已经看到需要这样做。更改表结构以使用auto_increment ID作为主键而不是用户名,并从其他表中引用ID,而不是直接引用名称。这可以防止跨表重复使用用户名,并允许您通过仅更新单个表来更改用户名。
请注意,您可能希望在用户名本身上保留一个UNIQUE索引以防止重复:当前,通过使用名称作为PK,您可以获得“免费”,并且您可以继续让DB通过制作来管理它一个新的指数。
答案 1 :(得分:1)
您可以设置表格以进行CASCADING更新。
这是通过使用外键和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
UNFORTUNATELY仅适用于InnoDB,因此您必须切换表格。
答案 2 :(得分:0)
您可以使用ON UPDATE CASCADE的外键约束在修改外键时自动更新外键(仅限InnoDB)。
但最好不要将用户名用作外键。您通常应该使用surrogate key作为外键,这样就不会出现问题。