MySQL在table1的插入上自动向table2插入一行

时间:2012-01-18 23:35:50

标签: mysql sql

当一行插入table1时,MySQL是否可以自动在table2中插入一行?

说我有以下基本结构:

用户表

id           int(8)       - primary key       - auto increment
username     varchar(20)

UserPrivacy表 - userprivacy.userIduser.id的外键

id           int(8)       - primary key       - auto increment
userId       int(8)       - foreign key

我是否可以使用默认值插入用户隐私权表中的行,但在运行user.id

等查询时,可以使用相应的INSERT INTO user (username) VALUES ('Bob');

除了触发器之外,还有其他方法吗?或者最好只在用户插入user时运行两个查询?

其次,如果为每个用户存储一个值,那么拥有一个单独的userprivacy表会浪费存储空间吗?将它放在用户表中会更有效吗?但我正试着让它尽可能轻..

user表格中有更多列我只是为此示例保持简单

2 个答案:

答案 0 :(得分:2)

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

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

如果它是一对一的关系,将它放在同一个表中允许更简单的查询(不需要加入)。

决定,决定......

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

如果UserPrivacy表很大,那么将它放在单独的表中以节省空间可能是有意义的。这也会更加规范化。

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

此外,如果隐私数据经常更新,而不是用户数据,则单独的表会阻止User表上的行锁定,并且较小的表上的更新会更快,这可能会提高性能。

如果您经常需要没有UserData的UserPrivacy数据,反之亦然,您可能希望将它们分开。

不过,这可能是过早的优化。如果它们更符合您的模型,您可能只想将它们分开。考虑将其保持在同一个表中的简单性与性能,大小和可读性问题的对比。

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

<强>最后...

只要有原因,不要害怕将它们分开。

答案 1 :(得分:0)

  

除了触发器之外还有其他方法吗?或者最好只运行两个触发器   用户插入用户时会进行查询吗?

如果通过您创建的UI(例如通过Web界面或本机应用程序)将记录插入数据存储,您可能应该有一个可以调用要插入的函数的库,并且在该函数中,您有两个单独的调用mysql插入。缺点是,如果用户通过mysql命令行插入记录,则应该分别进行两次调用。然后,你再问另一种方式,所以这就是我的建议。我的建议还鼓励用户使用你创建的gui。