如果其他位列为真,如何在ms sql中更改约束

时间:2017-07-07 14:19:18

标签: sql-server

我正在数据库中构建一个代码簿。 我有三列:

[IDReal] int identity (1,1), [IsReal] bit not null, [Code] nvarchar (20) null

现在我以某种方式得到了当用户将[IsReal]更改为1时,我的[Code]列变为非null且唯一,反之亦然。

我正在尝试像

这样的东西
CREATE TABLE [dbo].[sReal](
[IDReal] [int] IDENTITY(1,1) NOT NULL,
[Code] [nvarchar](20) NULL,
[IsReal] [bit] NOT NULL,

ALTER TABLE [dbo].[sReal] ADD  CONSTRAINT [DEF_IsReal]  DEFAULT ((0)) FOR [IsReal]
    GO

ALTER TABLE [dbo].[sReal] ADD  CONSTRAINT [CHNG_IsReal] IF [IsReal]=1 THEN (ALTER TABLE [dbo].[sReal] ALTER COLUMN [Code] [nvarchar](20) not null unique) 
ELSE END IF
GO`

当然,这不起作用,我不能使用触发器或函数或程序来解决这个问题。

是否还有其他解决方案可以完成我正在尝试做的事情。

3 个答案:

答案 0 :(得分:0)

这可以帮助您尝试其他方式尝试其他方式

IF EXISTS(

SELECT 1 From INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='sReal'
AND COLUMN_NAME='IsReal' AND DATA_TYPE='bit'
)
Begin
DECLARE @Real BIT
SELECT TOP 1@Real=[IsReal] From [sReal] WHERE  [IsReal]=1

IF (@Real=1 )
Begin

ALTER TABLE [dbo].[sReal] ALTER COLUMN [Code] [nvarchar](20) NOT NULL 

ALTER TABLE [dbo].[sReal] ADD CONSTRAINT UC_Code UNIQUE ([Code]);
END
END

答案 1 :(得分:0)

一种简单的方法可以是:

Declare @Variable1 int;
SELECT @Variable1 = [IsReal] From [sReal] WHERE  [IsReal]=1  --your user specific condition

IF @Variable1 = 1
BEGIN
    alter table [sReal] ALTER COLUMN [Code][nvarchar](20) NOT NULL
    alter table [sReal] ADD  CONSTRAINT [CHNG_IsReal] UNIQUE([Code])
END
ELSE 
IF @Variable1 <> 1  
BEGIN
    alter table [sReal] DROP  CONSTRAINT [CHNG_IsReal]
    alter table [sReal] ALTER COLUMN [Code][nvarchar](20) NULL
END

答案 2 :(得分:0)

您无法通过动态更改架构来解决此问题。该架构适用于整个表。相反,我相信你应该添加以下内容:

  1. 过滤的唯一索引,仅当IsReal的值为1时才能确保Code的唯一值:

    CREATE UNIQUE INDEX ix_code ON dbo.sReal (Code) WHERE IsReal = 1

  2. 一个检查约束,确保当IsReal为1时,Code永远不会为空

    ALTER TABLE dbo.sReal ADD CONSTRAINT cc_Code CHECK (IsReal = 0 OR Code IS NOT NULL)