当一行插入table1时,MySQL是否可以自动在table2中插入一行?
说我有以下基本结构:
用户表
id int(8) - primary key - auto increment
username varchar(20)
UserPrivacy表 - userprivacy.userId
是user.id
的外键
id int(8) - primary key - auto increment
userId int(8) - foreign key
我是否可以使用默认值插入用户隐私权表中的行,但在运行user.id
INSERT INTO user (username) VALUES ('Bob');
除了触发器之外,还有其他方法吗?或者最好只在用户插入user
时运行两个查询?
其次,如果为每个用户存储一个值,那么拥有一个单独的userprivacy表会浪费存储空间吗?将它放在用户表中会更有效吗?但我正试着让它尽可能轻..
user
表格中有更多列我只是为此示例保持简单
答案 0 :(得分:2)
您需要触发器才能“自动”将记录插入单独的表格中。
使用单独的查询将记录插入UserPrivacy将是实现此目的的最常用方法。
如果它是一对一的关系,将它放在同一个表中允许更简单的查询(不需要加入)。
决定,决定......
与一对一(零对一)关系,需要考虑更多因素。
如果UserPrivacy表很大,那么将它放在单独的表中以节省空间可能是有意义的。这也会更加规范化。
如果您经常查询“给我所有没有PrivacyData的用户”这样的内容,那么将它放在一个单独的表中可能是有意义的。由于索引不包含NULL值(默认情况下),因此对单独的表执行JOIN会更快。当然,解决方法是使用NULL以外的值来表示“无隐私设置”,但低基数也会对性能产生负面影响。对于这种情况,单独的表格是最好的。
此外,如果隐私数据经常更新,而不是用户数据,则单独的表会阻止User表上的行锁定,并且较小的表上的更新会更快,这可能会提高性能。
如果您经常需要没有UserData的UserPrivacy数据,反之亦然,您可能希望将它们分开。
不过,这可能是过早的优化。如果它们更符合您的模型,您可能只想将它们分开。考虑将其保持在同一个表中的简单性与性能,大小和可读性问题的对比。
如果关系是一对一(零到多),你显然想要一个单独的表,但对于一对一(零到一),它是可选的。
<强>最后... 强>
只要有原因,不要害怕将它们分开。
答案 1 :(得分:0)
除了触发器之外还有其他方法吗?或者最好只运行两个触发器 用户插入用户时会进行查询吗?
如果通过您创建的UI(例如通过Web界面或本机应用程序)将记录插入数据存储,您可能应该有一个可以调用要插入的函数的库,并且在该函数中,您有两个单独的调用mysql插入。缺点是,如果用户通过mysql命令行插入记录,则应该分别进行两次调用。然后,你再问另一种方式,所以这就是我的建议。我的建议还鼓励用户使用你创建的gui。