代码之家  ›  专栏  ›  技术社区  ›  Mike

通过并具有SQLITE3添加基于组的约束

  •  0
  • Mike  · 技术社区  · 1 年前

    我正在sqlite3(Python)中设置一个表。我创建的表称为测试和 我需要在这个表中添加一个约束条件,其中对于任何给定的日期,唯一条目的数量都不能大于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
            ))"""
    

    谢谢

    1 回复  |  直到 1 年前
        1
  •  1
  •   tinazmu    1 年前

    您可以为此使用触发器:

    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;
    

    这有帮助吗?