使用另外两个表中的新旧数据将数据插入表中

时间:2011-08-21 07:56:03

标签: sql

我的表名为Queue_info,结构为

Queue_Id number(10)
Movie_Id number(10)
User_Id Varchar2(20)
Status Varchar2(20)
Reserved_date date

我还有另外两个名为Movie_info的表,其中有许多列包括movie_IdUser_info,其中有许多列包含User_Id

在第一个表格中,movie_id, user_id是来自movie_info(movie_id)user_info(User_id)的外键。

我的问题是,如果我在Movie_infoUser_info中插入任何值,Queue_info表应更新为每个用户或每部电影的新条目

例如 如果作为新电影插入Movie_info,则应更新queue_info,因为每个用户都在等待新电影的状态。

2 个答案:

答案 0 :(得分:0)

使用触发器。通过使用触发器,您可以将所有相关表更新到表中。例如,如果1行插入表1,则1行也插入表2中。

答案 1 :(得分:0)

首先注意一些事项:

  • 我真的很喜欢你有一个标准化的方法来命名表和字段。我会使用Queue代替Queue_infoMovie代替Movie_info等等,因为所有表都有信息 - 不是吗? - 我们都知道。我也选择MovieId代替Movie_IdReservedDate代替Resedrved_date,但这是个人品味的问题(对下划线过敏)。
    我想强调的是,选择一种命名和保持它的方式是非常好的。

  • 我不喜欢的是,当您的结构看似规范化时,您使用Varchar键作为User_id键。如果主要(和外部)键尺寸小且尺寸恒定,则它们是最佳的。这主要有助于保持索引大小较小(因此更有效),其次因为密钥是db中重复存储的唯一值(因此它有助于保持较小的db大小)。


现在,对于你的问题,你真的需要这个吗?我的意思是,您最终可能会在数据库中拥有数千部电影和用户。是否要在插入新电影时在Queue表中添加一千行?当新用户注册时,还是另外一千行?当一个包含50部新电影的新列表到达时(或插入数据库中),还是5万行?

对于10K电影和2K用户,您将拥有一个20M行表。这个大小的表格没有问题,一个或多个触发器将满足您的需求。如果你有100K电影和50K用户会怎么样?一个5G行表。您也可以处理这个问题,但也许您只能在该表中保留用户感兴趣的电影(或已借用或已经看过的电影,无论数据库的用途是什么)。如果您想要某个用户尚未感兴趣的电影列表,请检查表中不存在的Movie_Id。用这样的东西:

SELECT
    Movie_Id, Movie_Title
FROM 
    Movie_info AS m
WHERE 
    NOT EXISTS
      ( SELECT *
        FROM Queue_info AS q
        WHERE q.Movie_Id = m.Movie_Id
          AND q.User_Id = @UserId
      )