Oracle 在多个表上插入之前触发

Oracle 在多个表上插入之前触发,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,我对触发器和PL/SQL相当陌生,所以我的问题主要是设计 我正在创建一组表来表示购票。门票有三种类型: 门票#1:价格、数量、时间 门票#2:价格、数量、时间、座位、可退款 门票#3:价格、数量、时间、食物、饮料 因此,我创建了三个表:(我认为这叫做规范化): 表1有价格、数量和时间列 表2有座位,可退款 表3有食物和饮料 我在表1中插入了一个主键列,并在表2和表3中使用指向表1主键的外键 计划:当用户购买票据时,我会在相应的表中插入一条记录。例如,如果用户购买: 票证#1,我在表1中插入一

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

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

  • 门票#1:价格、数量、时间
  • 门票#2:价格、数量、时间、座位、可退款
  • 门票#3:价格、数量、时间、食物、饮料
因此,我创建了三个表:(我认为这叫做规范化):
表1有价格、数量和时间列
表2有座位,可退款
表3有食物和饮料

我在表1中插入了一个主键列,并在表2和表3中使用指向表1主键的外键

计划:当用户购买票据时,我会在相应的表中插入一条记录。例如,如果用户购买:
票证#1,我在表1中插入一条记录
票证#2,我在表1和表2中插入一条记录
票证#3,我在表1和表3中插入一条记录

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

完整购买票证类型2的示例。
用户在线购买机票->网络表单发生的事情…->dao向数据库发送一个insert命令->表2的触发器启动并验证表1和表2的信息


谢谢

您可以按照任何方式进行设计,但考虑到票证类型之间没有太大差异,我将使用一个表:

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));
此处,检查约束用于确保根据票证类型仅填写适当的字段


祝你好运。

不要使用触发器-使用过程。在插入时如何激发该过程而不被触发器调用?它是如何获取所有参数的?不要从insert语句开始,然后调用触发器-使用值调用过程,然后让过程根据提供给过程的值向正确的表发出insert。感谢您的评论。我意识到我们可以将所有数据放在一个表中,但我正试图从“适当设计”的角度来解决这个问题。如果票证有足够的差异来保证每种类型都有自己的表,我只会再次遇到这个问题,因此,为什么我现在要解决它。