2012-01-18 51 views
2

当一行插入table1时,MySQL中是否可以自动向table2插入一行?MySQL在插入table1时自动向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当RAN的查询,如INSERT INTO user (username) VALUES ('Bob');

有没有一种方法比其他触发器或者这将是最好只运行两个查询,当用户插入user

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

有在user表我只是简单说明这个例子更多列

+0

触发器有什么问题? – Yahia 2012-01-18 23:49:42

+0

没有问题,只是想知道是否可能存在某种可以管理这种关系的关系。 – Dan 2012-01-18 23:52:54

+0

单桌和两个视图怎么样。如果表中有默认值插入视图应该做的AFAIK技巧。 – 2012-01-18 23:53:46

回答

2

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

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

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

决定,决定...

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

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

如果您经常查询诸如“给我没有PrivacyData的所有用户”之类的内容,那么将它放在单独的表格中可能有意义。由于索引不包含NULL值(默认情况下),因此对单独的表执行JOIN操作会更快。当然,解决方法是使用非NULL值来表示“无隐私设置”,但低基数也会对性能产生负面影响。单独的桌子最适合这种情况。另外,如果隐私数据经常更新,但不是用户数据,则单独的表将阻止用户表上的行锁定,并且在较小的表上更新速度更快,这可能会提高性能。

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

不过,这可能是不成熟的优化。如果他们更符合你的模型,你可能只想分开它们。考虑将其保留在同一个表中的简单性与性能,大小和可读性之间的关系。

如果关系是一对一(从零到很多),那么显然需要一个单独的表格,但是对于一对一(零对一),它是可选的。

最后...

不要害怕把它们分开,只要是有原因的。

+0

这将是最好的解决方案,例如,只有10%的用户表选择查询需要隐私权? – Dan 2012-01-18 23:57:01

+0

我更新了我的答案以提供更多详细信息。 – 2012-01-19 00:37:10

+1

@ Silver89:如果关系为1对1,则不需要'UserPrivacy'表中的'id'。使用'userid'作为主键(没有auto_increment)会很好。 – 2012-01-19 00:50:41

0

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

如果插入记录到您的数据存储是通过您创建的UI,例如通过网络接口或本机应用程序,你应该有一个可以调用的函数库中插入和该功能,你有两个独立的调用mysql插入。缺点是,如果用户通过mysql命令行插入记录,它应该是两个单独的调用。然后再次,你问另一种方式,所以这就是我的建议。我的建议也鼓励用户使用你创建的gui。

相关问题