Tsql T-SQL检查约束的代码是什么?
我想在此表中添加一个check子句,以便: 如果事务输入舒张压值 然后,事务还必须插入SYSTOLICBLODPRESSURE的值Tsql T-SQL检查约束的代码是什么?,tsql,Tsql,我想在此表中添加一个check子句,以便: 如果事务输入舒张压值 然后,事务还必须插入SYSTOLICBLODPRESSURE的值 CREATE TABLE "Constraint-BloodPressure".Patient ( patientNr int NOT NULL, diastolicBloodPressure smallint, systolicBloodPressure smallint, CONSTRAINT Patient_PK PRIMARY
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-谢谢您的指导。每个答案都有各自的帮助。所以我都喜欢!