在多个表上插入之前触发

时间:2016-02-06 22:51:36

标签: oracle plsql database-trigger

我对触发器和PL / SQL相当新,所以我的问题主要是设计。

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

  • 机票#1 :价格,数量,时间
  • 机票#2 :价格,数量,时间,座位,可退款
  • 门票#3 :价格,数量,时间,食物,饮料

所以我创建了三个表:(我相信这叫做,规范化):
表1 列有价格,数量和时间
表2 有座位和可退款
表3 有食物和饮料

我已经将一个主键列插入到Table1中,并使用Table2和Table3中的外键,这些外键指向Table1&#39的PK。

计划:当用户购买故障单时,我会将记录插入相应的表格中。例如,如果用户购买:
机票#1,我在表1中插入一条记录 票号#2,我在表1和表2中插入记录 机票#3,我在表1和表3中插入记录

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

完整购买2号机票的示例。
用户在线购买门票 - >网络形式的东西发生... - > dao向数据库发送一个插入命令 - > Table2的触发器启动并验证Table1和Table2的信息。

谢谢!

1 个答案:

答案 0 :(得分: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约束用于确保仅根据故障单类型填写相应的字段。

祝你好运。