SQL触发器小白求助 当A表更新某个字段后B表自动新增一条记录 应该如何实现?

时间:2021-03-17 14:57:13
例如:当A表的A1字段更新为zdjs时,B表自动插入一条记录,B表B0字段=max(B0)+1,B表B1字段=A表A1字段,B表B2字段=A表A2字段,在触发器里面应该怎样实现呢?

8 个解决方案

#1


试试这个
CREATE TRIGGER test ON A
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO B
                ( B0 ,
                  B1 ,
                  B2
                )
                SELECT  ( SELECT    MAX(B0)
                          FROM      B
                        ) + 1 ,
                        A1 ,
                        A2
                FROM    Inserted
                WHERE   A1 = 'zdjs'
    END 

#2


引用 1 楼 sinat_28984567 的回复:
试试这个
CREATE TRIGGER test ON A
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO B
                ( B0 ,
                  B1 ,
                  B2
                )
                SELECT  ( SELECT    MAX(B0)
                          FROM      B
                        ) + 1 ,
                        A1 ,
                        A2
                FROM    Inserted
                WHERE   A1 = 'zdjs'
    END 


十分感谢你的回答,我想实现复杂一点的功能,能帮我解答一下吗?可以的话我把200分都给你了。
---------------------------------
数据表:
A,B,C,D

数据表关系:
A表是表头,B表是A表的明细,关联字段是:A.A1=B.B1  A.A2=B.B2
C表是表头,D表是C表的明细,关联字段是:C.C1=D.D1  C.C2=D.D2  C.C3=D.D3

想要实现的功能:
当C表的C4字段更新为“zdjs”后,A表和B表自动增加记录,并且
A.A1=C.C1  A.A2=A.max(A2)+1  A.A4=C.C4
B.B1=A.A1  B.B2=A.A2  B.B3=C.C3  B.B5=C.C5  B.B6=D.D6  B.B7=D.D7
------------------------------------
万分感激

#3


先试试这个:
CREATE TRIGGER test ON C
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO A
                ( A1 ,
                  A2 ,
                  A4
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        ) + 1 ,
                        C4
                FROM    Inserted
                WHERE   C4 = 'zdjs'

        INSERT  INTO B
                ( B1 ,
                  B2 ,
                  B3 ,
                  B5 ,
                  B6 ,
                  B7
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        )+1 ,
                        C3 ,
                        C5 ,
                        D6 ,
                        D7
                FROM    Inserted
                        JOIN D ON C1 = D1
                                  AND C2 = D2
                                  AND C3 = D3
                WHERE   C4 = 'zdjs'
    END 


但是有几个问题,就是这种表头和明细一对多这种关系,怎么增加条数?
比如C表增加了一条数据,D表增加了对应的3条数据;有这种情况吗?这种情况B表更新几条记录?
还有就是表头和明细插入顺序的问题,如果先插入C表数据,D表没有插入,这时候触发器没法获取到D表数据。也就没法给AB更新,如果是这种情况可能就得把触发建在明细表上

#4


引用 3 楼 sinat_28984567 的回复:
先试试这个:
CREATE TRIGGER test ON C
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO A
                ( A1 ,
                  A2 ,
                  A4
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        ) + 1 ,
                        C4
                FROM    Inserted
                WHERE   C4 = 'zdjs'

        INSERT  INTO B
                ( B1 ,
                  B2 ,
                  B3 ,
                  B5 ,
                  B6 ,
                  B7
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        )+1 ,
                        C3 ,
                        C5 ,
                        D6 ,
                        D7
                FROM    Inserted
                        JOIN D ON C1 = D1
                                  AND C2 = D2
                                  AND C3 = D3
                WHERE   C4 = 'zdjs'
    END 


但是有几个问题,就是这种表头和明细一对多这种关系,怎么增加条数?
比如C表增加了一条数据,D表增加了对应的3条数据;有这种情况吗?这种情况B表更新几条记录?
还有就是表头和明细插入顺序的问题,如果先插入C表数据,D表没有插入,这时候触发器没法获取到D表数据。也就没法给AB更新,如果是这种情况可能就得把触发建在明细表上

---------------------------
没有,D表跟C表都是一对一的关系,D表只是C表的详细信息

#5


引用 4 楼 u010935133 的回复:
Quote: 引用 3 楼 sinat_28984567 的回复:

先试试这个:
CREATE TRIGGER test ON C
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO A
                ( A1 ,
                  A2 ,
                  A4
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        ) + 1 ,
                        C4
                FROM    Inserted
                WHERE   C4 = 'zdjs'

        INSERT  INTO B
                ( B1 ,
                  B2 ,
                  B3 ,
                  B5 ,
                  B6 ,
                  B7
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        )+1 ,
                        C3 ,
                        C5 ,
                        D6 ,
                        D7
                FROM    Inserted
                        JOIN D ON C1 = D1
                                  AND C2 = D2
                                  AND C3 = D3
                WHERE   C4 = 'zdjs'
    END 


但是有几个问题,就是这种表头和明细一对多这种关系,怎么增加条数?
比如C表增加了一条数据,D表增加了对应的3条数据;有这种情况吗?这种情况B表更新几条记录?
还有就是表头和明细插入顺序的问题,如果先插入C表数据,D表没有插入,这时候触发器没法获取到D表数据。也就没法给AB更新,如果是这种情况可能就得把触发建在明细表上

---------------------------
没有,D表跟C表都是一对一的关系,D表只是C表的详细信息


数据插入顺序呢?

#6


引用 5 楼 sinat_28984567 的回复:
Quote: 引用 4 楼 u010935133 的回复:

Quote: 引用 3 楼 sinat_28984567 的回复:

先试试这个:
CREATE TRIGGER test ON C
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO A
                ( A1 ,
                  A2 ,
                  A4
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        ) + 1 ,
                        C4
                FROM    Inserted
                WHERE   C4 = 'zdjs'

        INSERT  INTO B
                ( B1 ,
                  B2 ,
                  B3 ,
                  B5 ,
                  B6 ,
                  B7
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        )+1 ,
                        C3 ,
                        C5 ,
                        D6 ,
                        D7
                FROM    Inserted
                        JOIN D ON C1 = D1
                                  AND C2 = D2
                                  AND C3 = D3
                WHERE   C4 = 'zdjs'
    END 


但是有几个问题,就是这种表头和明细一对多这种关系,怎么增加条数?
比如C表增加了一条数据,D表增加了对应的3条数据;有这种情况吗?这种情况B表更新几条记录?
还有就是表头和明细插入顺序的问题,如果先插入C表数据,D表没有插入,这时候触发器没法获取到D表数据。也就没法给AB更新,如果是这种情况可能就得把触发建在明细表上

---------------------------
没有,D表跟C表都是一对一的关系,D表只是C表的详细信息


数据插入顺序呢?


插入顺序都是先表头,然后明细取表头关联字段,再插入明细的。

#7


引用 6 楼 u010935133 的回复:
插入顺序都是先表头,然后明细取表头关联字段,再插入明细的。

先试试那个吧,楼主说的是更新的时候才有这个操作,所以应该没问题

#8


引用 7 楼 sinat_28984567 的回复:
Quote: 引用 6 楼 u010935133 的回复:


插入顺序都是先表头,然后明细取表头关联字段,再插入明细的。

先试试那个吧,楼主说的是更新的时候才有这个操作,所以应该没问题


万分感谢~

#1


试试这个
CREATE TRIGGER test ON A
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO B
                ( B0 ,
                  B1 ,
                  B2
                )
                SELECT  ( SELECT    MAX(B0)
                          FROM      B
                        ) + 1 ,
                        A1 ,
                        A2
                FROM    Inserted
                WHERE   A1 = 'zdjs'
    END 

#2


引用 1 楼 sinat_28984567 的回复:
试试这个
CREATE TRIGGER test ON A
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO B
                ( B0 ,
                  B1 ,
                  B2
                )
                SELECT  ( SELECT    MAX(B0)
                          FROM      B
                        ) + 1 ,
                        A1 ,
                        A2
                FROM    Inserted
                WHERE   A1 = 'zdjs'
    END 


十分感谢你的回答,我想实现复杂一点的功能,能帮我解答一下吗?可以的话我把200分都给你了。
---------------------------------
数据表:
A,B,C,D

数据表关系:
A表是表头,B表是A表的明细,关联字段是:A.A1=B.B1  A.A2=B.B2
C表是表头,D表是C表的明细,关联字段是:C.C1=D.D1  C.C2=D.D2  C.C3=D.D3

想要实现的功能:
当C表的C4字段更新为“zdjs”后,A表和B表自动增加记录,并且
A.A1=C.C1  A.A2=A.max(A2)+1  A.A4=C.C4
B.B1=A.A1  B.B2=A.A2  B.B3=C.C3  B.B5=C.C5  B.B6=D.D6  B.B7=D.D7
------------------------------------
万分感激

#3


先试试这个:
CREATE TRIGGER test ON C
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO A
                ( A1 ,
                  A2 ,
                  A4
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        ) + 1 ,
                        C4
                FROM    Inserted
                WHERE   C4 = 'zdjs'

        INSERT  INTO B
                ( B1 ,
                  B2 ,
                  B3 ,
                  B5 ,
                  B6 ,
                  B7
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        )+1 ,
                        C3 ,
                        C5 ,
                        D6 ,
                        D7
                FROM    Inserted
                        JOIN D ON C1 = D1
                                  AND C2 = D2
                                  AND C3 = D3
                WHERE   C4 = 'zdjs'
    END 


但是有几个问题,就是这种表头和明细一对多这种关系,怎么增加条数?
比如C表增加了一条数据,D表增加了对应的3条数据;有这种情况吗?这种情况B表更新几条记录?
还有就是表头和明细插入顺序的问题,如果先插入C表数据,D表没有插入,这时候触发器没法获取到D表数据。也就没法给AB更新,如果是这种情况可能就得把触发建在明细表上

#4


引用 3 楼 sinat_28984567 的回复:
先试试这个:
CREATE TRIGGER test ON C
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO A
                ( A1 ,
                  A2 ,
                  A4
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        ) + 1 ,
                        C4
                FROM    Inserted
                WHERE   C4 = 'zdjs'

        INSERT  INTO B
                ( B1 ,
                  B2 ,
                  B3 ,
                  B5 ,
                  B6 ,
                  B7
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        )+1 ,
                        C3 ,
                        C5 ,
                        D6 ,
                        D7
                FROM    Inserted
                        JOIN D ON C1 = D1
                                  AND C2 = D2
                                  AND C3 = D3
                WHERE   C4 = 'zdjs'
    END 


但是有几个问题,就是这种表头和明细一对多这种关系,怎么增加条数?
比如C表增加了一条数据,D表增加了对应的3条数据;有这种情况吗?这种情况B表更新几条记录?
还有就是表头和明细插入顺序的问题,如果先插入C表数据,D表没有插入,这时候触发器没法获取到D表数据。也就没法给AB更新,如果是这种情况可能就得把触发建在明细表上

---------------------------
没有,D表跟C表都是一对一的关系,D表只是C表的详细信息

#5


引用 4 楼 u010935133 的回复:
Quote: 引用 3 楼 sinat_28984567 的回复:

先试试这个:
CREATE TRIGGER test ON C
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO A
                ( A1 ,
                  A2 ,
                  A4
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        ) + 1 ,
                        C4
                FROM    Inserted
                WHERE   C4 = 'zdjs'

        INSERT  INTO B
                ( B1 ,
                  B2 ,
                  B3 ,
                  B5 ,
                  B6 ,
                  B7
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        )+1 ,
                        C3 ,
                        C5 ,
                        D6 ,
                        D7
                FROM    Inserted
                        JOIN D ON C1 = D1
                                  AND C2 = D2
                                  AND C3 = D3
                WHERE   C4 = 'zdjs'
    END 


但是有几个问题,就是这种表头和明细一对多这种关系,怎么增加条数?
比如C表增加了一条数据,D表增加了对应的3条数据;有这种情况吗?这种情况B表更新几条记录?
还有就是表头和明细插入顺序的问题,如果先插入C表数据,D表没有插入,这时候触发器没法获取到D表数据。也就没法给AB更新,如果是这种情况可能就得把触发建在明细表上

---------------------------
没有,D表跟C表都是一对一的关系,D表只是C表的详细信息


数据插入顺序呢?

#6


引用 5 楼 sinat_28984567 的回复:
Quote: 引用 4 楼 u010935133 的回复:

Quote: 引用 3 楼 sinat_28984567 的回复:

先试试这个:
CREATE TRIGGER test ON C
    FOR UPDATE
AS
    BEGIN
        INSERT  INTO A
                ( A1 ,
                  A2 ,
                  A4
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        ) + 1 ,
                        C4
                FROM    Inserted
                WHERE   C4 = 'zdjs'

        INSERT  INTO B
                ( B1 ,
                  B2 ,
                  B3 ,
                  B5 ,
                  B6 ,
                  B7
                )
                SELECT  C1 ,
                        ( SELECT    MAX(A2)
                          FROM      A
                        )+1 ,
                        C3 ,
                        C5 ,
                        D6 ,
                        D7
                FROM    Inserted
                        JOIN D ON C1 = D1
                                  AND C2 = D2
                                  AND C3 = D3
                WHERE   C4 = 'zdjs'
    END 


但是有几个问题,就是这种表头和明细一对多这种关系,怎么增加条数?
比如C表增加了一条数据,D表增加了对应的3条数据;有这种情况吗?这种情况B表更新几条记录?
还有就是表头和明细插入顺序的问题,如果先插入C表数据,D表没有插入,这时候触发器没法获取到D表数据。也就没法给AB更新,如果是这种情况可能就得把触发建在明细表上

---------------------------
没有,D表跟C表都是一对一的关系,D表只是C表的详细信息


数据插入顺序呢?


插入顺序都是先表头,然后明细取表头关联字段,再插入明细的。

#7


引用 6 楼 u010935133 的回复:
插入顺序都是先表头,然后明细取表头关联字段,再插入明细的。

先试试那个吧,楼主说的是更新的时候才有这个操作,所以应该没问题

#8


引用 7 楼 sinat_28984567 的回复:
Quote: 引用 6 楼 u010935133 的回复:


插入顺序都是先表头,然后明细取表头关联字段,再插入明细的。

先试试那个吧,楼主说的是更新的时候才有这个操作,所以应该没问题


万分感谢~