2016-02-06 152 views
0

我对触发器和PL/SQL相当陌生,所以我的问题主要是设计之一。在插入多个表之前触发

我正在创建一组表来表示购票。有三种类型的门票:

  • 票务#1:价格,数量,时间
  • 票务#2:价格,数量,时间,座位,可退还
  • 票务#3 :价格,数量,时间,食品,饮料

所以我创建了三个表:(我相信这就是所谓的,正火):
表1有列价格,数量和时间
表2有座位和退款
表3有食品和饮料

我已插入主键列到表1和正在使用外资表2和表3中指向表1的PK的键。

该计划:当用户购买一张票时,我向相应的表中插入一条记录。举例来说,如果用户购买:
票证#1,I将记录插入表1
票证#2,我将记录插入表1和表2
票证#3,I将记录插入表1和表3

问题:如何接收不属于类型1的故障单的所有数据,然后拆分参数以插入到单独的表中。例如,当我尝试为Table2创建一个触发器时,该触发器只能接收与Table2列匹配的参数。我如何接收Table1的数据?

一个完整的购买车票种类2.
用户购买车票的一个例子在线 - > Web表单的东西happends ... - >道发送一个命令插入到数据库 - >触发器表2揭开序幕,并验证Table1和Table2的信息。

谢谢!

+0

请勿使用触发器 - 使用过程。 – MT0

+0

这个过程如何触发插入而不被触发器调用?它是如何获取所有参数的? – Seanimus

+0

不要从插入语句开始,然后调用触发器 - 使用这些值调用过程,然后根据提供给过程的值,让过程向正确的表发布插入。 – MT0

回答

0

你可以在任何你想要的设计这一点,但考虑到有没有票种太大的区别我有一个表:

CREATE TABLE TICKET 
(ID_TICKET  NUMBER 
    CONSTRAINT PK_TICKET 
     PRIMARY KEY 
     USING INDEX, 
    TICKET_TYPE  NUMBER 
    NOT NULL 
    CONSTRAINT TICKET_CK1 
     CHECK(TICKET_TYPE IN (1, 2, 3)), 
    PRICE   NUMBER 
    NOT NULL, 
    QUANTITY   NUMBER 
    NOT NULL, 
    DEPARTURE_TIME DATE 
    NOT NULL, 
    SEATING   NUMBER 
    CONSTRAINT TICKET_CK2 
     CHECK(1 = CASE TICKET_TYPE 
        WHEN 1 THEN CASE 
           WHEN SEATING IS NULL 
            THEN 1 
            ELSE 0 
           END 
        WHEN 2 THEN CASE 
           WHEN SEATING IS NULL 
            THEN 0 
            ELSE 1 
           END 
        WHEN 3 THEN CASE 
           WHEN SEATING IS NULL 
            THEN 1 
            ELSE 0 
           END 
       END), 
    REFUNDABLE_INDC CHAR(1) 
    NOT NULL 
    CONSTRAINT TICKET_CK3 
     CHECK(REFUNDABLE_INDC = CASE TICKET_TYPE 
           WHEN 1 THEN 'N' 
           WHEN 2 THEN 'Y' 
           WHEN 3 THEN 'N' 
           END), 
    FOOD    CHAR(1) 
    NOT NULL 
    CONSTRAINT TICKET_CK4 
     CHECK(FOOD = CASE TICKET_TYPE 
        WHEN 1 THEN 'N' 
        WHEN 2 THEN 'N' 
        WHEN 3 THEN 'Y' 
        END), 
    DRINK   CHAR(1) 
    NOT NULL 
    CONSTRAINT TICKET_CK5 
     CHECK(DRINK = CASE TICKET_TYPE 
         WHEN 1 THEN 'N' 
         WHEN 2 THEN 'N' 
         WHEN 3 THEN 'Y' 
        END)); 

这里CHECK约束用来确保只有根据票证类型填写适当的字段。

祝你好运。

+0

感谢您的评论。我意识到我们可以将所有数据都保存在一张表中,但我试图从“恰当的设计”的角度来解决这个问题。如果票据有足够的差异来保证每种类型都有自己的表格,我会再次遇到这个问题,因此,我现在试图解决它。 – Seanimus