在插入 SQLite 之前检查表 B 中的日期是不是介于表 A 中的日期之间

Posted

技术标签:

【中文标题】在插入 SQLite 之前检查表 B 中的日期是不是介于表 A 中的日期之间【英文标题】:Checking if date in table B is between date in Table A before inserting SQLite在插入 SQLite 之前检查表 B 中的日期是否介于表 A 中的日期之间 【发布时间】:2021-12-30 12:41:42 【问题描述】:

我有一个名为 Project 的表格,其中包含开始日期和结束日期。我还有一个名为 Plan 的表,它有自己的开始和结束日期列。但我有一些方法可以验证计划的开始/结束日期是否在匹配的项目开始/结束日期之间。

我不知道在我创建表时或在计划表中插入行时添加检查是否合适。到目前为止,我都尝试过,但都没有运气。

下面的代码给我一个错误消息没有这样的列。有谁知道如何解决这个问题?提前致谢。

https://i.stack.imgur.com/UC5Ai.png

%%sql
DROP TABLE IF EXISTS Plan;
CREATE TABLE Plan (
    pID varchar(255) NOT NULL UNIQUE,
    projectID varchar(255) NOT NULL UNIQUE,
    name varchar(255) NOT NULL DEFAULT ' ',
    startDate DATE NOT NULL DEFAULT '2000-12-31',
    endDate DARE NOT NULL DEFAULT '2000-12-31'
    CHECK (JulianDay(startDate) <= JulianDay(endDate) AND (startDate >= Project.startDate) AND 
           (endDate <= Project.endDate)),
    PRIMARY KEY (pID, projectID),
    FOREIGN KEY (projectID) REFERENCES Project(projectID)
);

【问题讨论】:

请将您的查询作为问题中的文本发布,而不是作为图像的链接 该模型确保每个项目只能有一个计划。你确定要那个吗? @TheImpaler 一个项目可以有很多计划。我做错了什么以确保每个项目只有一个计划? @PMolnes 删除ProjectID varchar(255) NOT NULL UNIQUE,行中的UNIQUE关键字 @TheImpaler 非常感谢!至于最初的问题,您知道我如何验证计划日期在项目日期之间吗? 【参考方案1】:

您需要一个BEFORE INSERT 触发器:

CREATE TRIGGER trg_ins_plan BEFORE INSERT ON Plan
BEGIN
  SELECT 
    CASE 
      WHEN NOT EXISTS (
          SELECT 1 
          FROM Project p 
          WHERE p.projectID = NEW.projectID AND p.startDate <= NEW.startDate AND p.endDate >= NEW.endDate
        )
        THEN RAISE(ABORT, 'Invalid dates')
    END;  
END;

还有一个BEFORE UPDATE 触发器:

CREATE TRIGGER trg_upd_plan BEFORE UPDATE ON Plan
BEGIN
  SELECT 
    CASE 
      WHEN NOT EXISTS (
          SELECT 1 
          FROM Project p 
          WHERE p.projectID = NEW.projectID AND p.startDate <= NEW.startDate AND p.endDate >= NEW.endDate
        )
        THEN RAISE(ABORT, 'Invalid dates')
    END;  
END;

另外,将日期的CHECK 约束更改为:

CHECK (JulianDay(startDate) <= JulianDay(endDate))

或者只是:

CHECK (startDate <= endDate)

请参阅demo。

【讨论】:

以上是关于在插入 SQLite 之前检查表 B 中的日期是不是介于表 A 中的日期之间的主要内容,如果未能解决你的问题,请参考以下文章

在插入之前检查 sqlite 中的重复项(核心数据)

在插入表之前检查数据是不是存在

TSQL - 如何在插入之前根据不同列中的值检查值?

在 SQL 和 VB.NET 中检查日期是不是小于另一个

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

在插入 BigQuery 表之前检查数据是不是已经存在(使用 Python)