高级sql server组合键

时间:2015-08-18 11:50:45

标签: sql-server key

我有一个sql server地址表。

用户可以放置StreetId或NeighborhoodId或CityID,但不能放置这三个字段中的2个。我可以通过ui限制用户,但我更愿意这样做在db级别强制执行此规则。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

您最好在业务逻辑层中执行此操作。

UI
^
业务逻辑
^
数据访问

这样的所有业务规则都可以在一个单独的业务逻辑层(BLL)中定义,如果不遵守规则,UI将调用并从BLL接收消息(可能会形成警告,信息或错误)至。如果对于当前用例遵守BLL中定义的所有规则,则BLL将调用将调用数据库的数据访问层(DAL),例如,数据访问层。使用已定义的业务规则使用BLL授权的参数的存储过程。

希望很清楚。

答案 1 :(得分:0)

这是我第一次遇到CHECK约束。但我认为下面的代码可能会有所帮助。

假设我们有一张表BaseTable

CREATE TABLE dbo.BaseTable
(
    StreetId VARCHAR(50),
    NeighborhoodId VARCHAR(50),
    CityID VARCHAR(50)
)

让我们添加一个CHECK约束:

ALTER TABLE dbo.BaseTable
ADD CONSTRAINT CheckOnlyOneColumnValue
CHECK (
(
    CASE WHEN StreetId IS NOT NULL THEN 1 ELSE 0 END
    + CASE WHEN NeighborhoodId IS NOT NULL THEN 1 ELSE 0 END
    + CASE WHEN CityID IS NOT NULL THEN 1 ELSE 0 END)
    = 1
)
GO

<强>测试

这些插入查询可以正常工作:

INSERT INTO dbo.BaseTable(StreetId) VALUES ('StreetId')
INSERT INTO dbo.BaseTable(NeighborhoodId) VALUES ('NeighborhoodId')
INSERT INTO dbo.BaseTable(CityID) VALUES ('CityID')

但这些查询将失败:

INSERT INTO dbo.BaseTable(StreetId, NeighborhoodId) 
VALUES ('StreetId', 'NeighborhoodId')

INSERT INTO dbo.BaseTable(StreetId, NeighborhoodId, CityID) 
VALUES ('StreetId', 'NeighborhoodId', 'CityID')

UPDATE dbo.BaseTable SET NeighborhoodId = 'NeighborhoodId' 
WHERE StreetId = 'StreetId'