数据库大神们帮忙看看。A表插入数据触发事件,B表更新数据

gzhosp_redAnt 2019-05-12 12:32:53
太久没做数据库这一块了,遇到了一个小问题。问题是这样的,打算实现一个类似于抢号源这样一个功能:
假如我有一张号源表T_APP_NUMBER,里面主要有四个字段,发放号源的单位,总号源,已经被抢占的号源,剩下的号源:

另外有一张预约表T_APP_INFO,存放用户的预约信息(包括用户预约的单位,字段名为ExcuteHospital)。里面有个字段AppStatus,当它为0的时候表示已经预约,为1的时候表示取消预约。
现在我的逻辑是这样的,
1. 当向T_APP_INFO成功插入一条记录的时候,表示预约成功,(比如用户张三预约了A医院)。那么此时T_APP_NUMBER表中A医院的数据就会这样变化:AppedNumber变成4(自动加一),RemainNumber变成16(自动减一)。B医院的号源不受影响(因为没有预约B医院),
2. 当向T_APP_INFO update一条数据,使得字段AppStatus=1的时候,表示取消预约(比如用户里斯取消了B医院的预约),那么此时T_APP_NUMBER表中B医院的数据就会这样变化:AppedNumber变成0(自动减一),RemainNumber变成30(自动加一)。A医院的号源不受影响(因为取消的是B医院)。
两张表用OrgName进行关联。
虽然不是不可以在后台用代码实现,但是总觉得可以在数据库上设立触发器做到,本人数据库确实不好,希望大家能给予帮助。谢谢了!
...全文
207 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
RINK_1 2019-05-20
  • 打赏
  • 举报
回复
引用 8 楼 GDMU_redAnt 的回复:
[quote=引用 7 楼 RINK_1 的回复:] [quote=引用 6 楼 GDMU_redAnt 的回复:] [quote=引用 5 楼 RINK_1 的回复:] [quote=引用 4 楼 GDMU_redAnt 的回复:] [quote=引用 2 楼 RINK_1 的回复:]


CREATE   TRIGGER  NUMBER_UPDATE ON T_APP_INFO 
FOR INSERT,UPDATE
AS

BEGIN

UPDATE T_APP_NUMBER
SET APPEDNUMBER=ISNULL(APPEDNUMBER,0)+B.QTY,
    REMAINNUMBER=ISNULL(REMAINNUMBER,0)-B.QYT
FROM T_APP_NUMBER A
JOIN
(SELECT ExcuteHospital,SUM(CASE WHEN AppStatus=0 THEN 1 ELSE -1 END) AS QTY 
FROM INSERTED
GROUP BY ExcuteHospital) AS B ON A.STUDYHOSPITAL=B.ExcuteHospital

END

大神能不能根据我刚刚更新的回复,看看能不能给我个具体的解决方案呢。刚刚一楼貌似说我解释的不是很清楚[/quote] 你在B医院申请了A医院的检查项目,对应T_APP_NUMBER表是修改B医院的记录?[/quote]是这样的,T_APP_NUMBER里面的数据,是每个医院放出来的号源,李四在A医院预约了B医院的检查,那么显然只是修改了T_APP_NUMBER中,B放出来的号源(也就是B对应的记录),而不会更改其他医院放出来的号源。是这个意思[/quote] 那你就用我#2的代码试试。[/quote] 不好意思那么晚才回复你,这个触发器代码是正常的。感谢感谢。现在有个小问题,不知道大神能不能看看。现在是,这两张表都有个字段StudyType。B医院放了两种检查类型(StudyType)的号源(自然在T_APP_NUMBER表中就有两个记录)。CT和MR。那么,如果李四在A医院预约的是B医院的CT检查,那么,修改的记录就是B医院的CT检查类型的记录。而不涉及B医院的MR类型。其实我从基本的逻辑角度上,就是在你的代码逻辑上加一个条件判断 where T_APP_NUMBER.StudyType = T_APP_Info.StudyType. 可是,我看了代码实在不知道该在哪里加,能不能告诉我一下,我在on后面加会报错。下面是T_APP_NUMBER表的测试数据: [/quote] 你再用下面的试试

CREATE   TRIGGER  NUMBER_UPDATE ON T_APP_INFO 
FOR INSERT,UPDATE
AS

BEGIN

UPDATE T_APP_NUMBER
SET APPEDNUMBER=ISNULL(APPEDNUMBER,0)+B.QTY,
    REMAINNUMBER=ISNULL(REMAINNUMBER,0)-B.QYT
FROM T_APP_NUMBER A
JOIN
(SELECT ExcuteHospital,StudyType,SUM(CASE WHEN AppStatus=0 THEN 1 ELSE -1 END) AS QTY 
FROM INSERTED
GROUP BY ExcuteHospital,StudyType) AS B ON A.STUDYHOSPITAL=B.ExcuteHospital AND A.StudyType=B.StudyType

END

gzhosp_redAnt 2019-05-18
  • 打赏
  • 举报
回复
引用 7 楼 RINK_1 的回复:
[quote=引用 6 楼 GDMU_redAnt 的回复:]
[quote=引用 5 楼 RINK_1 的回复:]
[quote=引用 4 楼 GDMU_redAnt 的回复:]
[quote=引用 2 楼 RINK_1 的回复:]


CREATE TRIGGER NUMBER_UPDATE ON T_APP_INFO
FOR INSERT,UPDATE
AS

BEGIN

UPDATE T_APP_NUMBER
SET APPEDNUMBER=ISNULL(APPEDNUMBER,0)+B.QTY,
REMAINNUMBER=ISNULL(REMAINNUMBER,0)-B.QYT
FROM T_APP_NUMBER A
JOIN
(SELECT ExcuteHospital,SUM(CASE WHEN AppStatus=0 THEN 1 ELSE -1 END) AS QTY
FROM INSERTED
GROUP BY ExcuteHospital) AS B ON A.STUDYHOSPITAL=B.ExcuteHospital

END

大神能不能根据我刚刚更新的回复,看看能不能给我个具体的解决方案呢。刚刚一楼貌似说我解释的不是很清楚[/quote]

你在B医院申请了A医院的检查项目,对应T_APP_NUMBER表是修改B医院的记录?[/quote]是这样的,T_APP_NUMBER里面的数据,是每个医院放出来的号源,李四在A医院预约了B医院的检查,那么显然只是修改了T_APP_NUMBER中,B放出来的号源(也就是B对应的记录),而不会更改其他医院放出来的号源。是这个意思[/quote]

那你就用我#2的代码试试。[/quote]
不好意思那么晚才回复你,这个触发器代码是正常的。感谢感谢。现在有个小问题,不知道大神能不能看看。现在是,这两张表都有个字段StudyType。B医院放了两种检查类型(StudyType)的号源(自然在T_APP_NUMBER表中就有两个记录)。CT和MR。那么,如果李四在A医院预约的是B医院的CT检查,那么,修改的记录就是B医院的CT检查类型的记录。而不涉及B医院的MR类型。其实我从基本的逻辑角度上,就是在你的代码逻辑上加一个条件判断 where T_APP_NUMBER.StudyType = T_APP_Info.StudyType. 可是,我看了代码实在不知道该在哪里加,能不能告诉我一下,我在on后面加会报错。下面是T_APP_NUMBER表的测试数据:

gzhosp_redAnt 2019-05-14
  • 打赏
  • 举报
回复
引用 5 楼 RINK_1 的回复:
[quote=引用 4 楼 GDMU_redAnt 的回复:]
[quote=引用 2 楼 RINK_1 的回复:]


CREATE TRIGGER NUMBER_UPDATE ON T_APP_INFO
FOR INSERT,UPDATE
AS

BEGIN

UPDATE T_APP_NUMBER
SET APPEDNUMBER=ISNULL(APPEDNUMBER,0)+B.QTY,
REMAINNUMBER=ISNULL(REMAINNUMBER,0)-B.QYT
FROM T_APP_NUMBER A
JOIN
(SELECT ExcuteHospital,SUM(CASE WHEN AppStatus=0 THEN 1 ELSE -1 END) AS QTY
FROM INSERTED
GROUP BY ExcuteHospital) AS B ON A.STUDYHOSPITAL=B.ExcuteHospital

END

大神能不能根据我刚刚更新的回复,看看能不能给我个具体的解决方案呢。刚刚一楼貌似说我解释的不是很清楚[/quote]

你在B医院申请了A医院的检查项目,对应T_APP_NUMBER表是修改B医院的记录?[/quote]是这样的,T_APP_NUMBER里面的数据,是每个医院放出来的号源,李四在A医院预约了B医院的检查,那么显然只是修改了T_APP_NUMBER中,B放出来的号源(也就是B对应的记录),而不会更改其他医院放出来的号源。是这个意思
RINK_1 2019-05-14
  • 打赏
  • 举报
回复
引用 6 楼 GDMU_redAnt 的回复:
[quote=引用 5 楼 RINK_1 的回复:] [quote=引用 4 楼 GDMU_redAnt 的回复:] [quote=引用 2 楼 RINK_1 的回复:]


CREATE   TRIGGER  NUMBER_UPDATE ON T_APP_INFO 
FOR INSERT,UPDATE
AS

BEGIN

UPDATE T_APP_NUMBER
SET APPEDNUMBER=ISNULL(APPEDNUMBER,0)+B.QTY,
    REMAINNUMBER=ISNULL(REMAINNUMBER,0)-B.QYT
FROM T_APP_NUMBER A
JOIN
(SELECT ExcuteHospital,SUM(CASE WHEN AppStatus=0 THEN 1 ELSE -1 END) AS QTY 
FROM INSERTED
GROUP BY ExcuteHospital) AS B ON A.STUDYHOSPITAL=B.ExcuteHospital

END

大神能不能根据我刚刚更新的回复,看看能不能给我个具体的解决方案呢。刚刚一楼貌似说我解释的不是很清楚[/quote] 你在B医院申请了A医院的检查项目,对应T_APP_NUMBER表是修改B医院的记录?[/quote]是这样的,T_APP_NUMBER里面的数据,是每个医院放出来的号源,李四在A医院预约了B医院的检查,那么显然只是修改了T_APP_NUMBER中,B放出来的号源(也就是B对应的记录),而不会更改其他医院放出来的号源。是这个意思[/quote] 那你就用我#2的代码试试。
RINK_1 2019-05-13
  • 打赏
  • 举报
回复


CREATE   TRIGGER  NUMBER_UPDATE ON T_APP_INFO 
FOR INSERT,UPDATE
AS

BEGIN

UPDATE T_APP_NUMBER
SET APPEDNUMBER=ISNULL(APPEDNUMBER,0)+B.QTY,
    REMAINNUMBER=ISNULL(REMAINNUMBER,0)-B.QYT
FROM T_APP_NUMBER A
JOIN
(SELECT ExcuteHospital,SUM(CASE WHEN AppStatus=0 THEN 1 ELSE -1 END) AS QTY 
FROM INSERTED
GROUP BY ExcuteHospital) AS B ON A.STUDYHOSPITAL=B.ExcuteHospital

END

wwfxgm 2019-05-13
  • 打赏
  • 举报
回复
您好,版主他们平时也忙,所以最好是把 create table 类似的结构提供,并提供一些测试数据。 不要图片,这样方便大家可以马上生成数据库表和测试数据。节约时间,你也可以马上得到解决问题的办法。
RINK_1 2019-05-13
  • 打赏
  • 举报
回复
引用 4 楼 GDMU_redAnt 的回复:
[quote=引用 2 楼 RINK_1 的回复:]


CREATE   TRIGGER  NUMBER_UPDATE ON T_APP_INFO 
FOR INSERT,UPDATE
AS

BEGIN

UPDATE T_APP_NUMBER
SET APPEDNUMBER=ISNULL(APPEDNUMBER,0)+B.QTY,
    REMAINNUMBER=ISNULL(REMAINNUMBER,0)-B.QYT
FROM T_APP_NUMBER A
JOIN
(SELECT ExcuteHospital,SUM(CASE WHEN AppStatus=0 THEN 1 ELSE -1 END) AS QTY 
FROM INSERTED
GROUP BY ExcuteHospital) AS B ON A.STUDYHOSPITAL=B.ExcuteHospital

END

大神能不能根据我刚刚更新的回复,看看能不能给我个具体的解决方案呢。刚刚一楼貌似说我解释的不是很清楚[/quote] 你在B医院申请了A医院的检查项目,对应T_APP_NUMBER表是修改B医院的记录?
gzhosp_redAnt 2019-05-13
  • 打赏
  • 举报
回复
引用 2 楼 RINK_1 的回复:


CREATE TRIGGER NUMBER_UPDATE ON T_APP_INFO
FOR INSERT,UPDATE
AS

BEGIN

UPDATE T_APP_NUMBER
SET APPEDNUMBER=ISNULL(APPEDNUMBER,0)+B.QTY,
REMAINNUMBER=ISNULL(REMAINNUMBER,0)-B.QYT
FROM T_APP_NUMBER A
JOIN
(SELECT ExcuteHospital,SUM(CASE WHEN AppStatus=0 THEN 1 ELSE -1 END) AS QTY
FROM INSERTED
GROUP BY ExcuteHospital) AS B ON A.STUDYHOSPITAL=B.ExcuteHospital

END

大神能不能根据我刚刚更新的回复,看看能不能给我个具体的解决方案呢。刚刚一楼貌似说我解释的不是很清楚
gzhosp_redAnt 2019-05-13
  • 打赏
  • 举报
回复
引用 1 楼 wwfxgm 的回复:
您好,版主他们平时也忙,所以最好是把 create table 类似的结构提供,并提供一些测试数据。 不要图片,这样方便大家可以马上生成数据库表和测试数据。节约时间,你也可以马上得到解决问题的办法。
是,是我考虑不周了(主要是表的字段太多了),这不是什么公司机密我大可发出来,给大家看看:
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[T_APP_INFO](
[InfoIdentity] [bigint] NOT NULL,
[PatientType] [int] NULL,
[HisCode] [nvarchar](32) NOT NULL,
[GetTime] [datetime] NULL,
[PatientName] [nvarchar](32) NULL,
[Sex] [nvarchar](16) NULL,
[Age] [int] NULL,
[AgeUnit] [nvarchar](16) NULL,
[PhoneNumber] [nvarchar](32) NULL,
[PatientId] [nvarchar](32) NULL,
[BedNo] [nvarchar](16) NULL,
[PatientRecordNo] [nvarchar](32) NULL,
[ChinaIdCard] [nvarchar](32) NULL,
[Modality] [nvarchar](32) NULL,
[Address] [nvarchar](128) NULL,
[OrderId] [nvarchar](32) NOT NULL,
[StudyItem] [nvarchar](64) NULL,
[HisItem] [nvarchar](64) NULL,
[StudyType] [nvarchar](64) NULL,
[AppDoctor] [nvarchar](32) NULL,
[AppDoctorId] [nvarchar](32) NULL,
[RegisterTime] [datetime] NULL,
[AppStatus] [tinyint] NULL,
[ItemFee] [nvarchar](16) NULL,
[FeeStatus] [tinyint] NULL,
[ExcuteHospital] [nvarchar](64) NULL,
[APPHospital] [nvarchar](64) NULL,
[AppTime] [datetime] NULL,
[OtherInfor] [varchar](300) NULL,
[AppTimeSeg] [varchar](64) NULL,
CONSTRAINT [PK_T_APP_INFO] PRIMARY KEY CLUSTERED
(
[InfoIdentity] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED
(
[HisCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED
(
[OrderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


其实这表最主要的字段有三个,AppStatus,表示预约的状态,0表示正常,1表示取消预约。ExcuteHospital是被预约的医院,APPHospital是申请预约的医院。下面的数据,表示的是李四在5月1日,在B医院预约了A医院的某项检查,预约状态为成功。

而系统有张表。记录每个医院发放的号源,表结构为:
CREATE TABLE [dbo].[T_APP_NUMBER] (
[NumberIdentity] bigint NOT NULL,
[StudyHospital] nvarchar(64) COLLATE Chinese_PRC_CI_AS NULL,
[BegTime] time(7) NULL,
[EndTime] time(7) NULL,
[TotalNumber] int NULL,
[AppedNumber] int NULL,
[RemainNumber] int NULL,
[StudyType] nvarchar(64) COLLATE Chinese_PRC_CI_AS NULL,
[StudyItem] nvarchar(64) COLLATE Chinese_PRC_CI_AS NULL,
[AppDate] date NULL,
[NumberComment] varchar(300) COLLATE Chinese_PRC_CI_AS NULL,
[Deleted] tinyint NULL,
CONSTRAINT [PK_T_APP_NUMBER] PRIMARY KEY CLUSTERED ([NumberIdentity])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
)

假设在李四预约之前,数据库的B医院数据是这样的:

。当李四预约成功之后(即数据插入成功),号源表中医院对应的记录中,AppedNumber变成2(自动加一),RemainNumber变成28(自动减一)。。
假设上图的号源表中的数据,是李四预约之后的数据,这个时候李四想取消预约了,就相当于把T_App_Infor表中的AppStatus字段update为1.这个时候,号源表周昂B医院对应的记录中,AppedNumber变成0(自动减一),RemainNumber变成30(自动加一)。。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧