当前位置: 首页 > 知识库问答 >
问题:

在多个表上插入前触发

颜华池
2023-03-14
    null

计划:当用户购买一张票时,我将一条记录插入到适当的表中。例如,如果用户购买:
Ticket#1,我将一条记录插入Table1
Ticket#2,我将一条记录插入Table1和Table2
Ticket#3,我将一条记录插入Table1和Table3

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

一个完整购买票证类型2的示例。
用户在线购买票证->web表单发生了...->dao向数据库发送一个insert命令->Table2的触发器启动并验证Table1和Table2的信息。

谢了!

共有1个答案

詹甫
2023-03-14

您可以以任何方式设计它,但考虑到票证类型之间没有太大差异,我将有一个单独的表:

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约束来确保根据票证类型只填写适当的字段。

祝你好运。

 类似资料:
  • 也许有人能帮我澄清一下。 我正在尝试编写一个插入前触发器,如果它留空,可以设置关闭。这可能吗? 没有太多代码可显示。我所做的只是创建了一个带有调试语句的简单的插入前触发器,以确保我的触发器在验证规则之前执行。似乎验证规则是第一位的(我显然无法更改它)。触发器永远不会触发。 这是可行的还是不可能的?

  • 我正在尝试创建一个触发器,该触发器将在更新另一个表之后更新一个表。我需要它,这样如果数字列中的一个数字被更新,那么这需要记录在另一个表中。这就是我到目前为止所拥有的。。 测试更新到表: 如您所见,我正在尝试将新插入的用户编号存储到一个变量中,然后该变量将用于填充user_changes表的insertednumber列。任何帮助都将不胜感激,谢谢!

  • 问题内容: 嘿,我有一个连接两个不相关表的Junction表。两个表都有。我需要使用不同的值从每个表中选择,例如,这就是我的看法: 我见过的所有示例都使用一条语句,但是两个表具有相同的值,在这种情况下,它们不是。 问题答案: 试试这个查询:

  • 问题内容: 我要在tableA上写一个插入触发器。它将使用相同的表但不同的列执行更新。执行此操作时出现错误。我的触发器是 我有一个应用程序将单独执行col2并将col1保持为空。因此,一旦插入行,我的触发器将为col1提供值。但是插入行时出现错误消息,提示“触发器失败且无效”。这该怎么做。TIA。 问题答案: 如果要分配一个简单的默认值,最简单的方法是使用DEFAULT子句在表上声明它。 这适用于

  • 在“name=new.user_name”后面发现意外的标记“end-of-statement”。预期的令牌可能包括:“”..sqlcode=-104,sqlstate=42601,driver=4.9.78 SQL code:-104,SQL state:42601

  • 问题内容: 假设我有两个表,并且 我想在一个查询中将来自某些输入的数据插入到表中,该怎么做? 请,如果可以做到,请解释语法。 问题答案: MySQL不支持在单个INSERT语句中进行多表插入。奇怪的是,Oracle是我所知道的唯一一个…