admin

MySQL自动插入一行到table2中,插入到table1中

sql

在MySQL中是否可以在将行插入到table1中时自动将行插入到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表中有更多列,在此示例中,我只是保持简单


阅读 169

收藏
2021-06-07

共1个答案

admin

您需要触发器才能“自动”将记录插入单独的表中。

使用单独的查询将记录插入UserPrivacy中将是实现此记录的最常见方法。

如果是一对一关系,则将其放在同一表中可以进行更简单的查询(无需联接)。

决定,决定…

对于一对(零对一)关系,有更多因素需要考虑。

如果UserPrivacy表很大,则可以将其放在单独的表中以节省空间。这也将更加规范化。

如果您经常查询“给我所有没有PrivacyData的用户”之类的信息,那么将其放在单独的表中可能是有意义的。由于索引不包含NULL值(默认情况下),因此对单独的表执行JOIN操作会更快。当然,解决方法是使用非NULL的值表示“无隐私设置”,但是低基数也会对性能产生负面影响。在这种情况下,最好使用单独的表。

另外,如果隐私数据(而不是用户数据)经常更新,则单独的表将防止用户表上的行锁定,并且在较小的表上更新速度更快,这可能会提高性能。

如果您经常需要不带UserData的UserPrivacy数据,反之亦然,则可能需要将它们分开。

不过,这可能是过早的优化。如果它们与您的模型更好地匹配,您可能只想将它们分开。考虑将其保存在同一张表中的简单性,而不是性能,大小和可读性的问题。

如果关系是一对一(零对多),显然您需要一个单独的表,但是对于一对一(零对一),它是可选的。

最后…

只要有理由,不要害怕将它们分开。

2021-06-07