Oracle 在多个表上插入之前触发
我对触发器和PL/SQL相当陌生,所以我的问题主要是设计 我正在创建一组表来表示购票。门票有三种类型:Oracle 在多个表上插入之前触发,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,我对触发器和PL/SQL相当陌生,所以我的问题主要是设计 我正在创建一组表来表示购票。门票有三种类型: 门票#1:价格、数量、时间 门票#2:价格、数量、时间、座位、可退款 门票#3:价格、数量、时间、食物、饮料 因此,我创建了三个表:(我认为这叫做规范化): 表1有价格、数量和时间列 表2有座位,可退款 表3有食物和饮料 我在表1中插入了一个主键列,并在表2和表3中使用指向表1主键的外键 计划:当用户购买票据时,我会在相应的表中插入一条记录。例如,如果用户购买: 票证#1,我在表1中插入一
- 门票#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。感谢您的评论。我意识到我们可以将所有数据放在一个表中,但我正试图从“适当设计”的角度来解决这个问题。如果票证有足够的差异来保证每种类型都有自己的表,我只会再次遇到这个问题,因此,为什么我现在要解决它。