首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个表插入前触发

在多个表插入前触发
EN

Stack Overflow用户
提问于 2016-02-06 22:51:36
回答 1查看 506关注 0票数 0

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

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

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

因此,我创建了三个表:(我相信这被称为正常化):

Table1有价格、数量和时间栏

Table2有座位和退款

Table3有食物和饮料

我在Table1中插入了一个主键列,并在Table2和Table3中使用外键,这指向表1的PK。

The Plan:当用户购买票证时,我会将记录插入到适当的表中。例如,如果用户购买:

票据#1,我在Table1中插入了一条记录

票据#2,我在Table1和Table2中插入了一条记录

票据#3,我在Table1和Table3中插入了一条记录

The Problem:如何接收非类型1的票证的所有数据,然后将参数拆分到单独的表中。例如,当我试图为Table2创建触发器时,该触发器只能接收与Table2列具有的参数匹配的参数。如何接收Table1的数据?

--一个完整购买票证类型2.的示例

用户购买票证网上->网站的东西发生..。-> dao将一个insert命令发送到用于Table2的数据库->触发器,并验证Table1和Table2的信息。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-02-07 01:47:52

您可以任意设计它,但是考虑到票证类型之间没有太大的差别,我将有一个表:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35247483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档