1

我有这张桌子。。

CREATE TABLE [dbo].[Tipo_Servicios_Info](
[TSI_TS_Id] [int] NOT NULL,
[TS_Tar_Id] [int] NOT NULL,
[TS_PDI_Id] [int] NOT NULL,
[TSI_Descripcion] varchar(100),
[TSI_FechaIni] date not null,
[TSI_FechaFin] date not null,
[TSI_HoraMin] time,
[TSI_HoraMax] time,
[TSI_Duracion] varchar(50) not null,
[TSI_Unidad] varchar(50) not null,
[TSI_Cantidad] int not null,

CONSTRAINT [PK_TIPO_SERVICIOS_INFO] PRIMARY KEY CLUSTERED 
(
[TSI_TS_Id] ASC,
[TS_Tar_Id] ASC,
[TS_PDI_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
       ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

通过一些检查..

ALTER TABLE Dbo.Tipo_Servicios_Info
ADD CONSTRAINT Ck_Valores_Unidad CHECK(Tsi_Unidad IN('Dia', 'Hora'));
GO

ALTER TABLE Dbo.Tipo_Servicios_Info
ADD CONSTRAINT Df_Tipo_Servicios_Info_Tsi_Unidad DEFAULT 'Dia' FOR Tsi_Unidad;
GO

在上面的这两个中,我将 TSI_Unidad 的默认值设置为“Dia”,但该字段只能包含 Dia 或 Hora 通过第二个约束。

但是我有一个问题,我必须定义可以为空的 TSI_HoraMin 和 TSI_HoraMax(如果 TSI_Unidad 是 Dia,它们必须可以为空),但是如果 TSI_Unidad 是 Hora,[TSI_HoraMin] 和 [TSI_HoraMax] 不能为空。

我想创建一个新的约束,但我不知道我该怎么做..

会是这个想法。。

ALTER TABLE [dbo].[Tipo_Servicios_Info]
ADD CONSTRAINT CK_HorasMin CHECK([TSI_HoraMin] is not null if [TSI_Unidad] = 'Hora')
GO

但显然,这个约束没有很好地定义。

4

1 回答 1

6

据我所知,如果 TSI_Unidad = 'Hora`,您试图不允许 TSI_HoraMin 出现空值。在这种情况下,您可以使用:

ALTER TABLE [dbo].[Tipo_Servicios_Info]
ADD CONSTRAINT CK_HorasMin 
CHECK(NOT([TSI_HoraMin] IS NULL AND [TSI_Unidad] = 'Hora'));
于 2012-09-27T09:21:33.530 回答