如何在Sql Server中添加带条件的默认约束?

时间:2017-11-29 13:12:49

标签: sql-server constraints sql-server-2014

我正在使用Sql Server 2014

CREATE TABLE [dbo].[Record](
    [RecordId] [int] IDENTITY(1,1) NOT NULL,
    [BookId] [int] NULL,
    [TopicId] [int] NULL,
    [BookName] [varchar](250) NULL,
    [TopicName] [varchar](250) NULL,
    [RecordPath] [varchar](250) NULL,
    [RecordName] [varchar](250) NULL,
    [DurationInSec] [float] NULL,
 CONSTRAINT [PK_Record] PRIMARY KEY CLUSTERED 
(
    [RecordId] ASC
)


ALTER TABLE dbo.Record ADD CONSTRAINT DC_RecordPath DEFAULT
             (CASE WHEN BookId = 1 THEN 'path/to/1' ELSE RecordPath END) 

我想要一个带有条件的默认约束,但不允许这样做。 没有使用触发器有没有解决方法?

编辑:计算列无效,因为该列由少数存储过程填充。 我有两个条件;

  1. 如果BookId为1,则RecordPath为路径1
  2. 对于任何BookIdRecordPath RecordPath来自存储过程

3 个答案:

答案 0 :(得分:0)

试试这个

ALTER TABLE dbo.Record ADD CONSTRAINT DC_RecordPath 
      CHECK ((CASE WHEN BookId = 1 THEN 'path/to/1' ELSE 'path/to/2' END)=RecordPath)

答案 1 :(得分:0)

可能违反条件是不允许的。但您可以使用CHECK选项执行相同的任务。您可以从here

找到帮助

答案 2 :(得分:0)

如果您需要,只需选中CHECK (BookId = 1 AND RecordPath = 'path/to/1') OR (BookId != 1)

的记录,就可以使用此功能
RecordPath = RecordPath

Esentialy这说:如果BookId等于1,那么路径必须是指定的路径,或者BookId可以是其他任何东西,对于那些记录,记录路径可以是任何东西。

第二部分不需要

TRUE,因为它总是sdk.dir = C://Users//USERNAME//AppData//Local//Android//sdk

或者您想要计算默认值吗?

这是不可能的,DEFAULT约束不能依赖于其他列。要实现类似的功能,您需要使用TRIGGER,或者您可以使用计算列或视图,并在读取数据时使用应用程序中的列/视图。