【问题标题】:MSSQL - is there a way to automatically add an entry to one table when an entry is added to another?MSSQL - 当一个条目被添加到另一个表时,有没有办法自动将一个条目添加到另一个表中?
【发布时间】:2016-04-18 14:57:59
【问题描述】:

我是一个 SQL 新手,所以请多多包涵。我的项目如下:

在 Windows Server 2008 R2 上使用 MSSQL。

有一个现有的数据库表 - 我们称之为 PRODUCTS - 其中包含数千行数据,即 X 公司销售的每个产品的产品信息。我感兴趣的三列是ITEMGROUPID、ITEMID 和ITEMNAME。 ITEMID 是该表的主键,是唯一的产品代码。 ITEMGROUPID 表示每个项目属于什么产品类别,ITEMNAME 是不言自明的。我只对一类产品感兴趣,因此通过使用 ITEMGROUPID 我可以确定我的表将有多少行(目前为 260)。

我现在正在创建一个表格,其中包含一些用于制作这些产品的参数 - 我们称之为 LINEPARAMETERS。例如,当我们制作 Widget A 时,我们需要 Conveyor B 以 C 速度运行。我打算在我的表中创建一个外键,指向另一个表中的 ITEMID。因此,我的新表中的每一行都将引用现有产品数据库中的特定产品。

我的问题是,如果开发了符合我的标准 (ITEMGROUPID = 'VALUE') 的新产品,并使用 ITEMID 输入到现有表中,我的表有什么方法可以自动生成一个新行所有其他列中的 ITEMID 和默认值?

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    您可以创建一个在插入到product 时触发的触发器,并将一行插入到lineparameters 中,如下所示:

    create trigger line_parameter_inserter
    on products
    after insert
    as
        insert into lineparameters (productId, col1, col2)
        values (inserted.id, 'foo', 'bar');
    

    但更好的选择是创建一个从产品表到您的组默认表的外键,这样在您插入产品表之前,默认表中必须存在一行,如下所示:

    create table lineparameters (
        id int,
        col1 int,
        ...,
        primary key (id)
    )
    
    create table products (
        id int,
        lineparametersId int not null,
        ...
        primary key (id),
        foreign key (lineparametersId) references lineparameters(id)
    )
    

    这将创建一个可靠的过程,并确保即使有人(默默地)禁用/删除触发器,您也不会遇到数据完整性问题。

    【讨论】:

    • 我不太清楚你的意思,你可以用稍微不同的方式来表达它吗?为了使您所指的表不那么模棱两可,我编辑了我的帖子,为这两个表定义了名称 - 您能否使用这些表名解释您的建议以避免混淆?
    • 明白了,这很有道理。但是,PRODUCTS 表中只有大约 10% 的产品实际上需要我的表中的条目(ITEMGROUPID = 'VALUE' 的那些),所以虽然我看到了确保没有数据完整性问题的价值,但我不确定这是我最好的前进方式。总而言之,如果该触发器被删除,这不是一个表演障碍;自动执行它真的只是一个不错的选择。如果我要坚持触发方法,如果刚刚插入 PRODUCTS 的行具有 (ITEMGROUPID = 'VALUE'),我该如何修改触发代码以仅在 LINEPARAMETERS 中插入一行?
    • 对于不是ITEMGROUPID = 'VALUE'的产品,可以允许FK为null,保持FK关系。您可以通过对“产品”表 check ITEMGROUPID != 'VALUE' or lineparametersId is not null 的检查约束来强制执行此操作
    猜你喜欢
    • 2020-11-18
    • 2023-01-25
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多