如何解决根据另一个表中的列的值对列使用检查约束
我有一张桌子:
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 举报,一经查实,本站将立刻删除。