微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决根据另一个表中的列的值对列使用检查约束

我有一张桌子:

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

我还有一张桌子:

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(含)之间。我知道我需要在这里使用检查约束,但我不知道如何使用另一个表的列来做到这一点。我该怎么做?

解决方法

检查约束不能引用其他表,因此您只需对 const userInsertResult = await getConnection() .transaction(async (transactionalEntityManager) => { const userInsertResult = await transactionalEntityManager .createQueryBuilder(User,'user') .insert() .into(User) .values({ email,password: hashedPassword }).execute(); const settingsInsertResult = await transactionalEntityManager .createQueryBuilder(Settings,'settings') .insert() .into(Settings) .values({ userId: userInsertResult.raw.id }).execute(); const profileInsertResult = await transactionalEntityManager .createQueryBuilder(Profile,'profile') .insert() .into(Profile) .values({ userId: userInsertResult.raw.id }).execute(); return userInsertResult }); INSERT 使用 2 个单独的触发器即可实现您想要的:

UPDATE

此外,我认为您应该更改表成员的定义,使 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_id 列的组合为 member_number

UNIQUE

参见demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。