t-sql多个记录的单个默认值

13 浏览
0 Comments

t-sql多个记录的单个默认值

我有一个MSSQL Server 2008的表格,将多张照片与房屋关联起来,如下所示:

HouseID - 关联到House表的外键
PhotoID - 关联到Photo表的外键

一切都运行得很好,PhotoID上有一个唯一约束,这样一张照片就不能与多个房屋关联起来。

我想为房屋记录指定一个默认照片。表格被更新如下:

HouseID
PhotoID
isDefault

问题是对于一组房屋照片只能有一个isDefault = 1。

在MSSQL Server 2008中,如何确保给定的House ID只有一个isDefault = 1,其他记录都是isDefault = 0?是使用触发器好,还是有更好的方法?如果使用触发器,对于确保优化的语法有什么建议?

最后,我需要在插入和更新事件上都能正常工作。

更新:

以下方法非常有效。有任何意见吗?

CREATE VIEW HousePhoto_isDefault AS 
SELECT yourSchema.HousePhoto.houseID, yourSchema.HousePhoto.isDefault
FROM yourSchema.HousePhoto WHERE isDefault = 1
GO
CREATE UNIQUE CLUSTERED INDEX idx_HousePhoto_isDefault
ON HousePhoto_isDefault (houseID)
GO

0
0 Comments

在这个问题中,需要为多个记录设置单个默认值。根据描述,可以使用触发器来实现。但是,如果对数据结构进行小的更改,可以使用常规约束来实现。不再在照片级别存储isDefault,而是在房屋级别存储DefaultPhotoId。这样,无论怎样,您都不会有多个默认照片。

如果要确保存在默认值,则设置为NOT NULL。这听起来是一个很好的解决方案。建议将其作为答案提出。

0
0 Comments

在MSSQL Server 2008中,如何确保给定的House ID只有一个isDefault = 1,并且其他记录为isDefault = 0?

正如Yves Samèr在这个答案中指出的那样,您可以使用一个过滤索引来实现:

CREATE UNIQUE INDEX photo_isDefault 
    ON Photos(HouseID) WHERE isDefault = 1 

DEMO

产生的错误是:

不能向具有唯一索引'photo_isDefault'的对象'dbo.Photos'插入重复键行:INSERT INTO Photos (houseID, isDefault) VALUES (1,1)

您也可以选择使用一个索引视图,或者如您所提到的触发器也可以。

问题的出现原因是要在给定的House ID中只有一个isDefault = 1,其他记录都是isDefault = 0。解决方法是使用过滤索引,创建一个唯一索引,只允许isDefault = 1的记录存在。如果尝试插入重复的记录,将会产生错误。另外,您还可以选择使用索引视图或触发器来实现相同的功能。

0
0 Comments

T-SQL Single Default Value for Multiple Records

在处理多条记录时,有时候需要为这些记录中的某一条设置默认值。本文将讨论这个问题的出现原因以及解决方法。

出现原因:

在给定的表中,我们可能有多个记录与同一个主键相关联。对于这些记录,我们希望为其中的一条记录设置一个默认值,而将其他记录的默认值设置为0。然而,单独为多条记录设置默认值是有挑战性的,因为T-SQL中没有直接支持这种操作的内置功能。

解决方法:

一种解决方法是使用CASE语句。下面是一个使用CASE语句的UPDATE语句示例(将变量替换为您正在使用的脚本语言):

UPDATE HousePhoto
SET isDefault = 
(
    CASE
        WHEN (PhotoID = )
        THEN 1
        ELSE 0
    END
)
WHERE HouseID = 

上述代码中,我们使用CASE语句将isDefault字段设置为1或0,具体取决于PhotoID是否等于指定的。如果是,则设置为1,否则设置为0。通过将此更新语句应用于表中的所有记录,我们就能够为其中的一条记录设置默认值。

另一种解决方法是使用两个单独的查询。下面是使用两个查询来设置默认值的示例:

UPDATE HousePhoto SET isDefault = 0 WHERE HouseID = 
UPDATE HousePhoto SET isDefault = 1 WHERE HouseID =  AND PhotoID = 

第一个查询将isDefault字段设置为0,以确保没有其他记录被错误地设置为默认值。第二个查询将isDefault字段设置为1,并且只有当PhotoID等于指定的时才会触发设置。

无论是使用CASE语句还是两个单独的查询,上述方法都可以帮助我们在处理多条记录时为其中的一条设置默认值。通过根据具体需求选择合适的解决方法,我们可以轻松地实现这个目标。

0