我正在数据库中构建一个代码簿。 我有三列:
[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`
当然,这不起作用,我不能使用触发器或函数或程序来解决这个问题。
是否还有其他解决方案可以完成我正在尝试做的事情。
答案 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)
您无法通过动态更改架构来解决此问题。该架构适用于整个表。相反,我相信你应该添加以下内容:
过滤的唯一索引,仅当IsReal的值为1时才能确保Code的唯一值:
CREATE UNIQUE INDEX ix_code ON dbo.sReal (Code) WHERE IsReal = 1
一个检查约束,确保当IsReal为1时,Code永远不会为空
ALTER TABLE dbo.sReal ADD CONSTRAINT cc_Code CHECK (IsReal = 0 OR Code IS NOT NULL)