【问题标题】:Check constraint on join检查连接约束
【发布时间】:2019-12-04 10:00:27
【问题描述】:
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,1) PRIMARY KEY,
    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
);

每当将新行插入事件时,我想检查它是否符合参数的周期。

如果 periode = '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_calendarid_param 传递给 UDF 并从 CHECK 调用它?

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

【问题讨论】:

  • 您可以使用带有ROLLBACK 命令的AFTER INSERT 触发器,如果​​您的某些条件不满足,则执行该命令。有关更多信息,请参阅此答案:stackoverflow.com/a/13374004/1220550

标签: sql sql-server join case check-constraints


【解决方案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,1) PRIMARY KEY,
    param varchar(30),
    periode varchar(20) not null, -- 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)
);

【讨论】:

  • 好的,从日历中引用期间是个好主意。
【解决方案2】:

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

    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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2011-01-28
    • 2017-10-23
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多