Sql server 如果其他位列为true,如何更改ms sql中的约束

Sql server 如果其他位列为true,如何更改ms sql中的约束,sql-server,Sql Server,我正在数据库中建立一个代码本。 我有三个专栏: [IDReal]int-identity(1,1),[IsReal]位不为null,[code]nvarchar(20)null 现在,当用户将[IsReal]更改为1时,我的列[Code]将更改为NOTNULL和unique,反之亦然 我在尝试类似的东西 CREATE TABLE [dbo].[sReal]( [IDReal] [int] IDENTITY(1,1) NOT NULL, [Code] [nvarchar](20) NULL, [I

我正在数据库中建立一个代码本。 我有三个专栏:

[IDReal]int-identity(1,1),[IsReal]位不为null,[code]nvarchar(20)null

现在,当用户将[IsReal]更改为1时,我的列[Code]将更改为NOTNULL和unique,反之亦然

我在尝试类似的东西

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`
当然,这不起作用,我不能使用触发器、函数或过程来解决这个问题


有没有其他解决办法来完成我想做的事情。

这可能会帮助你再试一次,或者用另一种方式再试一次

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
一个简单的方法可以是:

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
Declare@variable1int;
从[sReal]中选择@Variable1=[IsReal],其中[IsReal]=1--您的用户特定条件
如果@Variable1=1
开始
alter table[sReal]alter COLUMN[Code][nvarchar](20)不为空
alter table[sReal]添加约束[CHNG_IsReal]唯一([Code])
结束
其他的
如果@Variable1
开始
alter table[sReal]DROP约束[CHNG_IsReal]
alter table[sReal]alter COLUMN[Code][nvarchar](20)NULL
结束

动态更改架构无法解决此问题。模式应用于整个表。相反,我认为您应该添加以下内容:

  • 一个经过筛选的唯一索引,以确保仅当IsReal的值为1时代码的唯一值:

    在dbo.sReal(code)上创建唯一索引ix_代码,其中IsReal=1

  • 一个检查约束,确保当IsReal为1时代码永远不为空

    ALTER TABLE dbo.sReal ADD CONSTRAINT cc_code CHECK(IsReal=0或代码不为NULL)