Sql 检查(插入期间)建筑物是否始终具有相同的地址

Sql 检查(插入期间)建筑物是否始终具有相同的地址,sql,sql-server,Sql,Sql Server,我正在编写一个而不是INSERT触发器,它在插入之前验证数据 为了简化我的问题:把这当作我的插入: INSERT INTO Event VALUES ('A', 'building1', 'adress1'), ('B', 'building2', 'adress2'), ('C', 'building1', 'adress3') 我需要捕捉插入的表包含具有不同地址的相同建筑的情况——这是不可能的 一些IF语句片段在这里真的会对我有帮助。为什么要使用触发器?问题在

我正在编写一个
而不是INSERT
触发器,它在插入之前验证数据

为了简化我的问题:把这当作我的插入:

INSERT INTO Event 
VALUES ('A', 'building1', 'adress1'),
       ('B', 'building2', 'adress2'),
       ('C', 'building1', 'adress3')
我需要捕捉插入的表包含具有不同地址的相同建筑的情况——这是不可能的


一些
IF
语句片段在这里真的会对我有帮助。

为什么要使用触发器?问题在于您的数据模型

如果一个建筑只能有一个地址,那么您应该有一个名为
建筑
的表:

create table Buildings (
    BuildingId int identity primary key,
    BuildingName varchar(255),
    Address varchar(255)
);
然后,您的
事件
表应参考
构建ID

create table Events (
    EventId int identity primary key,
    EventName varchar(255) unique,
    BuildingId int references Buildings(BuildingId)
);

您不应该使用触发器来回避数据模型的问题。

为什么要使用触发器来解决这个问题?问题在于您的数据模型

如果一个建筑只能有一个地址,那么您应该有一个名为
建筑
的表:

create table Buildings (
    BuildingId int identity primary key,
    BuildingName varchar(255),
    Address varchar(255)
);
然后,您的
事件
表应参考
构建ID

create table Events (
    EventId int identity primary key,
    EventName varchar(255) unique,
    BuildingId int references Buildings(BuildingId)
);

您不应该使用触发器来回避数据模型的问题。

最佳解决方案由Gordon提供。如果对结构进行规范化不是一个选项,则可以考虑2个列“代码>建筑物、地址< /代码>的组合来考虑<代码>唯一索引< /代码>。如果这也不是一个选项,并且您确实需要创建触发器:

if exists(select building 
          from inserted 
          group by building 
          having count(distinct address) > 1)
begin
    --your logic here
end

最佳解决方案由Gordon提供。如果对结构进行规范化不是一个选项,则可以考虑2个列“代码>建筑物、地址< /代码>的组合来考虑<代码>唯一索引< /代码>。如果这也不是一个选项,并且您确实需要创建触发器:

if exists(select building 
          from inserted 
          group by building 
          having count(distinct address) > 1)
begin
    --your logic here
end

改为使用检查约束怎么样?@JamesZ很遗憾,在这种情况下使用触发器是必需的。改为使用检查约束怎么样?@JamesZ很遗憾,在这种情况下使用触发器是必需的。告诉我的“分配列表”。这就是当练习显式地让你写简单问题的延迟解决方案时所发生的情况。此外,问题已经简化。我实际上所做的是一个“父”表,当修改它时,应该更新它的子表——它看起来与您在这里显示的表完全相同。我需要在“父”表级别tho上进行验证-因此我的问题。@Ernio。确实存在一些问题,
而不是
触发器是个好主意。当课程开发人员没有指出问题的正确解决方案时,这是令人悲哀的。我认为学生们没有学好他们应该学的东西。告诉我的“作业清单”。这就是当练习显式地让你写简单问题的延迟解决方案时所发生的情况。此外,问题已经简化。我实际上所做的是一个“父”表,当修改它时,应该更新它的子表——它看起来与您在这里显示的表完全相同。我需要在“父”表级别tho上进行验证-因此我的问题。@Ernio。确实存在一些问题,
而不是
触发器是个好主意。当课程开发人员没有指出问题的正确解决方案时,这是令人悲哀的。我认为学生们没有学好这些材料。我从来没有想到“计数(不同地址)”中的不同。很高兴知道。另外,我完全同意“最佳解决方案”部分。我从来没有在“计数(不同地址)”中想到不同。很高兴知道。此外,我完全同意“最佳解决方案”部分。