检查连接约束

CREATE TABLE Calendar (
    id_calendar INT IDENTITY(1,1) PRIMARY KEY,year int NOT NULL,month int NULL,day_of_month int NULL,day_of_week int NULL,week_of_year int NULL
);

CREATE TABLE Param(
    id_param INT IDENTITY(1,param varchar(30),periode varchar(20),CONSTRAINT check_periode CHECK (periode IN ('Day','Week','Month','Year'))
);

CREATE TABLE Event (
    id_calendar INT,id_param INT
);

每当将新行插入Event时,我都要检查它是否符合参数的句点。

如果期间='Day',则 year,month,day_of_month,day_of_week,week_of_year 中的任何一个都不为NULL。

如果periode ='Week',则只有day_of_month和day_of_week应该为NULL,

...

因此,我需要同时加入FK'S和从那里建立一个CHECK约束。是否可以将 id_calendar id_param 传递给UDF并从CHECK调用它?

出于性能原因,我不想使用全局查询,而只使用涉及受影响的行及其外键的检查。

qqq691608414 回答:检查连接约束

是的。您可以定义一个函数来验证值,并在“检查约束”中引用它。

    CREATE FUNCTION CheckEvent(@id_Calendar INT,@id_param INT)
    RETURNS BIT
    AS
    BEGIN
    ---LOGIC 
    END    

添加检查约束以使用该功能

    ALTER TABLE Event ADD CONSTRAINT CHK_Event CHECK( dbo.CheckEvent(id_param,id_calendar) = 1)
,

periode创建一个实体,并在相关时引用它。使用复合键表示“相同的periode”约束。

CREATE TABLE Periodes (
   periode varchar(20),CONSTRAINT check_periode CHECK (periode IN ('Day','Week','Month','Year'));
INSERT ...

CREATE TABLE Calendar (
    id_calendar INT IDENTITY(1,1) PRIMARY KEY,periode varchar(20) not null,-- FK to Periodes.Period 
      -- + check nulls according to period 
      -- + unique (id_calendar,periode) 
    year int NOT NULL,month int NULL,day_of_month int NULL,day_of_week int NULL,week_of_year int NULL
);

CREATE TABLE Param(
    id_param INT IDENTITY(1,param varchar(30),-- FK to Periodes.Period
    --  + unique(id_param,periode)
);

CREATE TABLE Event (
    id_calendar INT,id_param INT,periode varchar(20) not null --  + FK(id_calendar,periode) => Calendar(id_calendar,periode)  
      -- + FK(id_param,periode) => Param(id_param,periode)
);
本文链接:https://www.f2er.com/2979198.html

大家都在问