添加基于group by的约束并具有SQLITE3

问题描述 投票:0回答:1

我正在 sqlite3 (Python) 中设置一个表。我创建的表称为 test 和 我需要为此表添加一个约束,其中任何给定日期的唯一条目数不能大于 3。主键是 x、y 和有效日期。请注意,我有很多有效日期,但这只是为了说明。

con = sqlite3.connect(path2Database)
cursorObj = con.cursor()
query = """ CREATE TABLE IF NOT EXISTS TEST
      (x INTEGER NOT NULL,
       y INTEGER NOT NULL,
       Valid_from DATE NOT NULL,
       Valid_until DATE,
       value REAL,
       PRIMARY KEY (x, y, Valid_from) )"""    
cursorObj.execute(query)

cursorObj.execute("""INSERT OR REPLACE INTO TEST VALUES
                  (2, 3, '2023-02-28', '2023-03-04', 1),
                  (1, 1, '2023-02-28', '2023-03-05', 1), 
                  (4, 2, '2023-02-28', '2023-03-02', 1)
                  """)
con.commit()

我应该无法插入有效日期为“2023-02-28”的另一行,因为它只允许任何给定日期有 3 个值。

cursorObj.execute("""INSERT INTO TEST VALUES (4, 2, '2023-02-28', '2023-03-02', 1)""")

我尝试添加下面的约束,但我不断收到操作错误。解决这个问题的最佳方法是什么?

query = """ CREATE ASSERTION checkCount CHECK
        ( NOT EXISTS (
        SELECT COUNT(x) AS total
        FROM TEST
        GROUP BY Valid_from
        HAVING total > 3
        ))"""

谢谢

sql sqlite sqlite3-python
1个回答
0
投票

您可以为此使用触发器:

CREATE TRIGGER LIMIT_VALID_FROM_CNT
BEFORE INSERT ON TEST
FOR EACH ROW
BEGIN
    SELECT RAISE(ABORT, 'We already have three rows of these')
    WHERE (SELECT COUNT(*) AS total
         FROM TEST t
         WHERE t.valid_From=NEW.valid_from)>=3;
END;

这有帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.