2013-04-11 103 views
0

我有两个表:
一个用于活动用户,另一个用于非活动用户。两者都有用户的全名和他的电子邮件地址。 我希望只有在两个表中都不存在的情况下(例如他的电子邮件地址)才能插入新用户。 如果他存在于非活动表中,我将通过将用户从非活动表移动到活动表来重新激活他。插入行,如果它不在一个表中不存在

有没有办法通过试图插入某种查询和捕捉异常(如果他存在),而不是通过检查插入前是否存在用户?

+0

在试图插入并检查其他表上是否存在的表上放置一个触发器。如果存在,你的举动。 – xQbert 2013-04-11 12:06:27

+4

难道你不觉得做一个用户表并使用0或1来指定活动会很聪明吗? is_active = 0/1 ...这也会使检查更容易我猜 – CaptainCarl 2013-04-11 12:06:46

+0

可能不是你的选择,但我会让他们全都在同一个表中使用布尔字段来指定它们是否处于活动状态 – OlleR 2013-04-11 12:07:03

回答

2

仅仅因为你的数据是巨大的,并不意味着你必须在两天它拆分,这会导致你很多头痛。您不仅在CRUD操作中遇到麻烦,而且在将表格链接到其他表格时也会遇到麻烦。你一定要有一个表格和一个布尔字段来表示用户是否处于活动状态。

要处理查询的大数据和速度,您可以采取其他操作,如partitioning。 P:你试图做的是以某种方式重新创建分区。

+0

谢谢@jurgenreza。你有一些分区和索引的例子吗? – Yaniv 2013-04-11 14:50:05

+0

@Yaniv取决于您使用的DBMS。 MySQL的? SQL Server? – jurgenreza 2013-04-11 14:55:03

+0

我正在使用MySQL。谢谢。 – Yaniv 2013-04-11 15:06:28

0

通过捕获异常来实现条件逻辑是一种效率低下的设计。你会简单地检查第一好得多,看看如果电子邮件地址在两个表中存在:

IF EXISTS (SELECT 1 FROM InactiveUsers WHERE Email = @new_email) 
    BEGIN 
    INSERT INTO ActiveUsers ... 
    DELETE FROM InactiveUsers ... 
    END 
IF NOT EXISTS (SELECT 1 FROM ActiveUsers WHERE Email = @new_email) 
    INSERT INTO ActiveUsers... 
+0

好的,但我怎么知道用户是否最终被插入? – Yaniv 2013-04-11 14:20:44

+0

我更新了伪代码;但你不需要检查用户是否已经插入 - 插入将工作,否则会引发错误。 – 2013-04-11 15:27:20

相关问题