创建Sql触发器以根据其他表中的字段添加新行

时间:2018-07-18 14:02:47

标签: sql database triggers

我需要创建触发器,以便在更新其他表中的值时在表中添加新行。 例如,如果我将table1中的值更改为5,则需要在其他表(table2)中创建五(5)个带有table1某些值的新行(例如ID或也获取其他值)。

示例: 表1

ID     Date     Flag   NumberOfNewRowsInTable2
1   17/07/2017    1              0

当更改为5时,我需要创建“ NumberOfNewRowsInTable2”列的值 在Table2中新增五行:

表2

ID     Field1     Field2
1        X          Y
1        X          Y
1        X          Y
1        X          Y
1        X          Y

谢谢大家,对我的解释不好。我使用SQL Server。现在,我尝试更好地解释它。我需要分期创建付款,因此我希望用户选择多个分期付款,并且我会自动在table2(付款分期付款表)中拥有相等的行数(每个分期付款一个)。现在,例如:有Table1。在Table1中有一个ID字段,我可以选择记录的付款类型。用户选择分期付款时,还可以选择分期数。当用户选择所需的分期付款次数时,我将自动在table2(付款分期付款表)中具有相等的行数(每期付款一次)和相应的ID(在Table2的字段ID中)。另一个问题是:当用户分期付款并插入其他类型的付款时,我需要将其从Table2中删除。此外,如果用户更改了分期付款的数量,则需要用新的等价分期付款的数量来调整行。我希望能更好地解释它,并感谢大家的回答。安德里亚

是否可以通过触发器执行此操作? 谢谢你们, 安德里亚。

1 个答案:

答案 0 :(得分:0)

这当然可以通过触发器来完成。您没有在问题中指定要使用的RDBMS,但是我的知识是T-SQL,所以这就是答案的写法。

首先,看来要插入的行数基于该列值是动态的,因此,如果数据库中还没有Numbers表,那么您将需要一个Numbers表。这将使添加所需数量的行变得相当容易,而无需尝试依赖循环。您可以找到一些适当地创建和填充Numbers表here的方法,但在此示例中,我只是做了一些小改动:

CREATE TABLE dbo.Numbers
(
    ID bigint
)

INSERT INTO dbo.Numbers
VALUES (1), (2), (3), (4), (5)

接下来,触发本身。 T-SQL触发器将仅通过对其创建表的更改来触发,因此您要在Table1上创建触发器。然后,触发器的内容可以在任意数量的其他表中插入/更新/删除行。我之所以这么说只是因为您的问题的措辞似乎意味着您正以相反的方式思考它-触发器将位于Table2上,如果对此阅读过多,我深表歉意。无论如何,触发器的代码:

CREATE TRIGGER dbo.tgrTable1_Update
    ON dbo.Table1
    AFTER UPDATE
AS
BEGIN
    INSERT INTO dbo.Table2
    (
        ID,
        Field1,
        Field2
    )
    SELECT
        inserted.ID,
        'X',
        'Y'
    FROM inserted
    JOIN deleted
        ON deleted.ID = inserted.ID
    JOIN dbo.Numbers n
        ON n.ID <= inserted.NumberOfNewRowsInTable2
    WHERE inserted.NumberOfNewRowsInTable2 != deleted.NumberOfNewRowsInTable2
END

Numbers表上的联接条件可确保您仅添加所需的行数,仅此而已。您可以调整联接和where子句以适合您实际需要的条件。

编辑:感谢您为问题添加一些额外的细节。这样的触发器仍然应该能够执行您描述的操作。您只需要在触发器的内容中添加一些逻辑即可处理您预见的情况。您可能要考虑更改SELECT的内容以包含分期付款计算,或者在Table2上使用软删除列,这样就不会对历史数据很重要地不断添加和删除行。您还可以在一个触发器中执行多个插入/更新语句,因此您应该能够将所有必需的逻辑放入此结构中。