Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否根据外键连接的行中的行值在SQL Server中添加签入?_Sql Server - Fatal编程技术网

Sql server 是否根据外键连接的行中的行值在SQL Server中添加签入?

Sql server 是否根据外键连接的行中的行值在SQL Server中添加签入?,sql-server,Sql Server,我想创建以下两个表,其中开始日期必须早于结束日期: CREATE TABLE ParentEntity ( ID int NOT NULL IDENTITY(1,1) PRIMARY KEY, StartDate date NOT NULL, EndDate date NOT NULL, Description varchar(255) ); ALTER TABLE ParentEntity ADD CHECK (DATEDIFF(da

我想创建以下两个表,其中开始日期必须早于结束日期:

CREATE TABLE ParentEntity 
(
    ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,    
    StartDate date NOT NULL,    
    EndDate date NOT NULL, 
    Description varchar(255)
); 

ALTER TABLE ParentEntity
  ADD CHECK (DATEDIFF(day,StartDate ,EndDate) > 0)

CREATE TABLE ChildEntity 
( 
    ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,    
    Parent int NOT NULL FOREIGN KEY REFERENCES ParentEntity (ID),    
    StartDate date NOT NULL,    
    EndDate date NOT NULL, 
    Description varchar(255)
); 

ALTER TABLE ChildEntity 
  ADD CHECK (DATEDIFF(day,StartDate ,EndDate) > 0)
现在我想添加这个检查:每个
ChildEntity
行的
StartDate
EndDate
必须出现在相应的
ParentEntity
行的
StartDate
EndDate
之间的日期间隔内


我怎么能开这张支票?我不知道如何引用通过外键定义的行。

我会在
检查中使用简单的比较,而不是
DATEDIFF

如果要引用父表列中的值,很遗憾,需要复制子表中的列。更新级联中带有
的FK可以持续维护该数据。然后,您需要决定是否要公开子表中这些列的存在,以及它们最初是如何填充的

因此,最基本的是:

CREATE TABLE ParentEntity ( 
    ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,    
    StartDate date NOT NULL,    
    EndDate date NOT NULL, 
    Description varchar(255),
    constraint UQ_ParentEntity_Dates UNIQUE (ID,StartDate,EndDate)
); 

ALTER TABLE ParentEntity
  ADD CHECK (StartDate < EndDate)

CREATE TABLE ChildEntity ( 
    ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,    
    Parent int NOT NULL FOREIGN KEY REFERENCES ParentEntity (ID),    
    StartDate date NOT NULL,    
    EndDate date NOT NULL, 
    Description varchar(255),
    ParentStart date NOT NULL,
    ParentEnd date NOT NULL,
    constraint FK_ChildParent FOREIGN KEY
      (Parent,ParentStart,ParentEnd) references ParentEntity
      (ID,StartDate,EndDate) ON UPDATE CASCADE
); 

ALTER TABLE ChildEntity 
  ADD CHECK (StartDate <EndDate)

ALTER TABLE ChildEntity
  ADD CHECK (StartDate >=ParentStart and EndDate <= ParentEnd)
创建表父实体(
ID int非空标识(1,1)主键,
StartDate日期不为空,
EndDate日期不为空,
描述varchar(255),
约束UQ_ParentEntity_日期唯一(ID、StartDate、EndDate)
); 
ALTER表ParentEntity
添加支票(开始日期<结束日期)
创建表子实体(
ID int非空标识(1,1)主键,
Parent int NOT NULL外键引用ParentEntity(ID),
StartDate日期不为空,
EndDate日期不为空,
描述varchar(255),
父开始日期不为空,
ParentEnd日期不为空,
约束FK_ChildParent外键
(父级、父级开始、父级结束)引用父级实体
更新级联上的(ID、StartDate、EndDate)
); 
ALTERTABLE子实体

添加检查(StartDate=ParentStart和EndDate我会在
检查中使用简单的比较,而不是
日期差异

如果要引用父表列中的值,很遗憾,您需要复制子表中的列。更新级联时带有
的FK
可以持续维护该数据。然后,您需要决定是否要公开子表中这些列的存在,以及如何获取这些列最初人口众多

因此,最基本的是:

CREATE TABLE ParentEntity ( 
    ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,    
    StartDate date NOT NULL,    
    EndDate date NOT NULL, 
    Description varchar(255),
    constraint UQ_ParentEntity_Dates UNIQUE (ID,StartDate,EndDate)
); 

ALTER TABLE ParentEntity
  ADD CHECK (StartDate < EndDate)

CREATE TABLE ChildEntity ( 
    ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,    
    Parent int NOT NULL FOREIGN KEY REFERENCES ParentEntity (ID),    
    StartDate date NOT NULL,    
    EndDate date NOT NULL, 
    Description varchar(255),
    ParentStart date NOT NULL,
    ParentEnd date NOT NULL,
    constraint FK_ChildParent FOREIGN KEY
      (Parent,ParentStart,ParentEnd) references ParentEntity
      (ID,StartDate,EndDate) ON UPDATE CASCADE
); 

ALTER TABLE ChildEntity 
  ADD CHECK (StartDate <EndDate)

ALTER TABLE ChildEntity
  ADD CHECK (StartDate >=ParentStart and EndDate <= ParentEnd)
创建表父实体(
ID int非空标识(1,1)主键,
StartDate日期不为空,
EndDate日期不为空,
描述varchar(255),
约束UQ_ParentEntity_日期唯一(ID、StartDate、EndDate)
); 
ALTER表ParentEntity
添加支票(开始日期<结束日期)
创建表子实体(
ID int非空标识(1,1)主键,
Parent int NOT NULL外键引用ParentEntity(ID),
StartDate日期不为空,
EndDate日期不为空,
描述varchar(255),
父开始日期不为空,
ParentEnd日期不为空,
约束FK_ChildParent外键
(父级、父级开始、父级结束)引用父级实体
更新级联上的(ID、StartDate、EndDate)
); 
ALTERTABLE子实体

添加检查(StartDate=ParentStart和EndDate“constraint UQ\u ParentEntity\u日期唯一”的功能是什么(ID、StartDate、EndDate),因为我已经有了一个定义为主键的ID?简短的检查更加优雅,我肯定会使用它,给它们命名也是一个很好的建议。只有当父实体更新时,子实体才会更新吗?如果我尝试将子实体中的“ParentStart”更新为与实际ParentEntity StartDate不同的值,会发生什么?最后一个问题:每个ParentEntity可以有许多ChildEntity。我认为您的示例是更新子实体的ID值,这不应该发生,对吗?@DaniëlCamps-抱歉,FK应该在
Parent、ParentStart、ParentEnd
上,而不是使用
ID
。现在更正了
UNIQUE
的目的父级上的“不”是指允许使用FK约束在父级和子级之间检查所有这三列。最后,我命名了所有约束,将所有约束声明放在CREATE TABLE子句中,使用了更简单的日期检查。我使用的是子级-父级日期检查。“constraint UQ\U ParentE”的功能是什么唯一的实体日期(ID、开始日期、结束日期),因为我已经有了一个定义为主键的ID?简短的检查更加优雅,我肯定会使用它,给它们命名也是一个很好的建议。只有当父实体更新时,子实体才会更新吗?如果我尝试将子实体中的“ParentStart”更新为与实际ParentEntity StartDate不同的值,会发生什么?最后一个问题:每个ParentEntity可以有许多ChildEntity。我认为您的示例是更新子实体的ID值,这不应该发生,对吗?@DaniëlCamps-抱歉,FK应该在
Parent、ParentStart、ParentEnd
上,而不是使用
ID
。现在更正了
UNIQUE
的目的父级上的“不”是指允许使用FK约束在父级和子级之间检查所有这三列。最后,我命名了所有约束,将所有约束声明放在CREATE TABLE子句中,使用更简单的日期检查,我使用的是子级-父级日期检查。