Tsql T-SQL检查约束的代码是什么?

Tsql T-SQL检查约束的代码是什么?,tsql,Tsql,我想在此表中添加一个check子句,以便: 如果事务输入舒张压值 然后,事务还必须插入SYSTOLICBLODPRESSURE的值 CREATE TABLE "Constraint-BloodPressure".Patient ( patientNr int NOT NULL, diastolicBloodPressure smallint, systolicBloodPressure smallint, CONSTRAINT Patient_PK PRIMARY

我想在此表中添加一个check子句,以便:

如果事务输入舒张压值

然后,事务还必须插入SYSTOLICBLODPRESSURE的值

CREATE TABLE "Constraint-BloodPressure".Patient
(
    patientNr int NOT NULL,
    diastolicBloodPressure smallint,
    systolicBloodPressure smallint,
    CONSTRAINT Patient_PK PRIMARY KEY(patientNr)
)
这是正确的吗


不确定您使用的是什么数据库系统。在SQL Server 2014上,我需要指定NULL或NOT NULL。所以我的CREATETABLE语句和check约束和insert语句如下所示

IF OBJECT_ID('tempdb.dbo.#Patient', 'U') IS NOT NULL
    DROP TABLE #Patient;

CREATE TABLE #Patient
(
    patientNr INT NOT NULL
  , diastolicBloodPressure SMALLINT NULL
  , systolicBloodPressure SMALLINT NULL
  , CONSTRAINT Patient_PK
        PRIMARY KEY (patientNr)
  , CHECK ((
               diastolicBloodPressure IS NOT NULL
               AND systolicBloodPressure IS NOT NULL
           )
           OR (
                  diastolicBloodPressure IS NULL
                  AND systolicBloodPressure IS NULL
              )
          )
);

INSERT INTO #Patient VALUES (1, NULL, NULL);
INSERT INTO #Patient VALUES (2, 120, NULL);
INSERT INTO #Patient VALUES (3, NULL, 80);
INSERT INTO #Patient VALUES (4, 120, 80);

第一个和最后一个insert语句工作,中间两个语句失败。

不确定您使用的是什么数据库系统。在SQL Server 2014上,我需要指定NULL或NOT NULL。所以我的CREATETABLE语句和check约束和insert语句如下所示

IF OBJECT_ID('tempdb.dbo.#Patient', 'U') IS NOT NULL
    DROP TABLE #Patient;

CREATE TABLE #Patient
(
    patientNr INT NOT NULL
  , diastolicBloodPressure SMALLINT NULL
  , systolicBloodPressure SMALLINT NULL
  , CONSTRAINT Patient_PK
        PRIMARY KEY (patientNr)
  , CHECK ((
               diastolicBloodPressure IS NOT NULL
               AND systolicBloodPressure IS NOT NULL
           )
           OR (
                  diastolicBloodPressure IS NULL
                  AND systolicBloodPressure IS NULL
              )
          )
);

INSERT INTO #Patient VALUES (1, NULL, NULL);
INSERT INTO #Patient VALUES (2, 120, NULL);
INSERT INTO #Patient VALUES (3, NULL, 80);
INSERT INTO #Patient VALUES (4, 120, 80);

第一个和最后一个insert语句起作用,中间两个语句失败。

如果要强制两个字段都有值,则需要检查空值。如果没有,则当前检查将只允许输入patientNbr或一个值

CREATE TABLE dbo.Patient
(
    patientNr int NOT NULL,
    diastolicBloodPressure smallint,
    systolicBloodPressure smallint,
    CONSTRAINT Patient_PK PRIMARY KEY(patientNr),
    CONSTRAINT CHK_BloodPressure CHECK (ISNULL(diastolicBloodPressure, 0) > 0 AND ISNULL(systolicBloodPressure, 0) > 0 )
);
GO

-- Valid
INSERT INTO dbo.Patient VALUES (1, 120, 80);
GO
-- Invalid
INSERT INTO dbo.Patient VALUES (2, 120, 0);
GO
-- Invalid
INSERT INTO dbo.Patient VALUES (3, 0, 80);
GO
-- Invalid
INSERT INTO dbo.Patient (patientNr, diastolicBloodPressure) VALUES (4, 120);
GO
-- Invalid
INSERT INTO dbo.Patient (patientNr) VALUES (5);
GO

如果要强制这两个字段都有值,则需要检查空值。如果没有,则当前检查将只允许输入patientNbr或一个值

CREATE TABLE dbo.Patient
(
    patientNr int NOT NULL,
    diastolicBloodPressure smallint,
    systolicBloodPressure smallint,
    CONSTRAINT Patient_PK PRIMARY KEY(patientNr),
    CONSTRAINT CHK_BloodPressure CHECK (ISNULL(diastolicBloodPressure, 0) > 0 AND ISNULL(systolicBloodPressure, 0) > 0 )
);
GO

-- Valid
INSERT INTO dbo.Patient VALUES (1, 120, 80);
GO
-- Invalid
INSERT INTO dbo.Patient VALUES (2, 120, 0);
GO
-- Invalid
INSERT INTO dbo.Patient VALUES (3, 0, 80);
GO
-- Invalid
INSERT INTO dbo.Patient (patientNr, diastolicBloodPressure) VALUES (4, 120);
GO
-- Invalid
INSERT INTO dbo.Patient (patientNr) VALUES (5);
GO

您没有指定表是否接受空值以及如何处理它们

根据这些数据,我的建议是:

CREATE TABLE dbo.TestCheck
(
     patientNr INT NOT NULL CONSTRAINT PK_TestCheck PRIMARY KEY
    ,diastolicBloodPressure smallint NOT NULL
    ,systolicBloodPressure smallint NOT NULL
    ,CONSTRAINT chk_TestCheck_MustEnterBoth CHECK(diastolicBloodPressure BETWEEN 0 AND 250 AND systolicBloodPressure BETWEEN 0 AND 250)
);
-该表将不接受空值,并将强制输入的值保持在实际边界内。 -您可以使用tinyint代替smallint,tinyint的定义介于0和255之间

-请尝试以下操作:

INSERT INTO dbo.TestCheck VALUES(1,100,110);
GO
INSERT INTO dbo.TestCheck VALUES(2,100,NULL);
GO
INSERT INTO dbo.TestCheck VALUES(3,NULL,NULL);
GO
INSERT INTO dbo.TestCheck VALUES(4,-1,1000);
GO
SELECT * FROM dbo.TestCheck;
-只有第一次插入会成功,所有其他尝试都会失败 -仔细清理真实数据

GO
DROP TABLE dbo.TestCheck;

您没有指定表是否接受空值以及如何处理它们

根据这些数据,我的建议是:

CREATE TABLE dbo.TestCheck
(
     patientNr INT NOT NULL CONSTRAINT PK_TestCheck PRIMARY KEY
    ,diastolicBloodPressure smallint NOT NULL
    ,systolicBloodPressure smallint NOT NULL
    ,CONSTRAINT chk_TestCheck_MustEnterBoth CHECK(diastolicBloodPressure BETWEEN 0 AND 250 AND systolicBloodPressure BETWEEN 0 AND 250)
);
-该表将不接受空值,并将强制输入的值保持在实际边界内。 -您可以使用tinyint代替smallint,tinyint的定义介于0和255之间

-请尝试以下操作:

INSERT INTO dbo.TestCheck VALUES(1,100,110);
GO
INSERT INTO dbo.TestCheck VALUES(2,100,NULL);
GO
INSERT INTO dbo.TestCheck VALUES(3,NULL,NULL);
GO
INSERT INTO dbo.TestCheck VALUES(4,-1,1000);
GO
SELECT * FROM dbo.TestCheck;
-只有第一次插入会成功,所有其他尝试都会失败 -仔细清理真实数据

GO
DROP TABLE dbo.TestCheck;

谢谢你的建议。是的,伙计们,我罪过!我应该使用notnull。然而,我的重点是check子句。我想指定一些规则,使我们的建模工具从我们称之为相等约束的内容中生成一个适当的check子句。现在,我试图找出在一个表中的两个或多个列之间生成相等约束的规则。稍后,我必须弄清楚如何跨两个或多个表执行此操作。你们都帮了大忙。Thanks@KenEvans请允许我一个提示:你们真是太好了,说你们都帮了大忙,但是:艾萨克回答下面的这句话不会传到其他任何人。我只是偶然回来的。。。表示感谢的方式就是向上投票并接受你最喜欢的答案。@Isaac,顺便说一句:创建一个没有名字的约束是一个非常坏的习惯。这将使用随机名称创建。试想一下,您可能需要在250个客户数据库中更改此约束条件,并且在名称不同的任何地方…@Shnugo Point很好。@Shnugo-谢谢您的指导。每个答案都有各自的帮助。所以我都喜欢!谢谢你的建议。是的,伙计们,我罪过!我应该使用notnull。然而,我的重点是check子句。我想指定一些规则,使我们的建模工具从我们称之为相等约束的内容中生成一个适当的check子句。现在,我试图找出在一个表中的两个或多个列之间生成相等约束的规则。稍后,我必须弄清楚如何跨两个或多个表执行此操作。你们都帮了大忙。Thanks@KenEvans请允许我一个提示:你们真是太好了,说你们都帮了大忙,但是:艾萨克回答下面的这句话不会传到其他任何人。我只是偶然回来的。。。表示感谢的方式就是向上投票并接受你最喜欢的答案。@Isaac,顺便说一句:创建一个没有名字的约束是一个非常坏的习惯。这将使用随机名称创建。试想一下,您可能需要在250个客户数据库中更改此约束条件,并且在名称不同的任何地方…@Shnugo Point很好。@Shnugo-谢谢您的指导。每个答案都有各自的帮助。所以我都喜欢!