sql - 根据另一个表中列的值对列使用检查约束

标签 sql database sqlite check-constraints

我有一张 table :

CREATE TABLE teams (
    id INTEGER PRIMARY KEY,
    member_count INTEGER NOT NULL
);

我还有另一张 table :

CREATE TABLE members (
    id INTEGER PRIMARY KEY,
    team_id INTEGER,
    member_number INTEGER
    FOREIGN KEY (team_id) REFERENCES teams (id)
);

我希望member_number 的值介于1 和member_count(含)之间。我知道我需要在这里使用检查约束,但我不知道如何使用另一个表的列来做到这一点。我该怎么做?

最佳答案

检查约束不能引用其他表,因此您只需使用 INSERTUPDATE 两个单独的触发器即可实现您想要的效果:

CREATE TRIGGER insert_member_number BEFORE INSERT ON members
BEGIN
  SELECT
    CASE
      WHEN NEW.member_number NOT BETWEEN 1 AND (SELECT member_count FROM teams WHERE id = NEW.team_id) 
        THEN RAISE (ABORT, 'Invalid member number')
    END;
END;

CREATE TRIGGER update_member_number BEFORE UPDATE ON members
BEGIN
  SELECT
    CASE
      WHEN NEW.member_number NOT BETWEEN 1 AND (SELECT member_count FROM teams WHERE id = NEW.team_id) 
        THEN RAISE (ABORT, 'Invalid member number')
    END;
END;

此外,我认为您应该更改表成员的定义,以便列 team_idmember_number 的组合是 UNIQUE:

CREATE TABLE members (
    id INTEGER PRIMARY KEY,
    team_id INTEGER NOT NULL,
    member_number INTEGER NOT NULL,
    UNIQUE(team_id, member_number),
    FOREIGN KEY (team_id) REFERENCES teams (id)
);

请参阅demo .

关于sql - 根据另一个表中列的值对列使用检查约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65378259/

相关文章:

sql - 如何使用其字符串值对 JSON 数组进行排序?

php - mysql连接表

c# - 有没有办法创建接受 <= N 参数的参数化查询或存储过程?

sql - 使用索引按字符串前缀选择

php - 如果条件为空,则 SQL WHERE 子句返回 ALL

java - 具有数千万用户的现实社交网络模型。我应该使用哪些技术?

python - 如何组合多个 django 查询集聚合和过滤器

performance - 运行 sqlite 查询后如何加快获取结果的速度?

android - [android]如何在缺少一列的情况下向数据库添加新列?

Sql 选择每个汇总组的前 3 个