我有两张 table ,一张叫选票,一张叫选票。 Ballots 存储一个字符串列表,代表人们可以投票的选项:
CREATE TABLE IF NOT EXISTS Polls (
id SERIAL PRIMARY KEY,
options text[]
);
Votes 存储用户所做的投票(其中投票是一个整数,代表他们投票的选项的索引):CREATE TABLE IF NOT EXISTS Votes (
id SERIAL PRIMARY KEY,
poll_id integer references Polls(id),
value integer NOT NULL ,
cast_by integer NOT NULL
);
我想确保无论何时在 Votes 表中创建一行,“value”的值都在 Polls 中对应行的范围 [0,length(options)) 内(对应,我的意思是 poll_id 所在的行比赛)。我可以实现任何类型的检查或外键约束来实现这一点吗?还是我需要某种触发器?如果是这样,那个触发器会是什么样子,会不会有性能问题?使用 SELECT 语句手动查询相应的民意调查,然后在插入到 Votes 表之前断言“值”是有效的,是否会同样高效?
最佳答案
我建议你修改你的数据模型来有一个表,PollOptions
:
CREATE TABLE IF NOT EXISTS PollOptions (
PollOptionsId SERIAL PRIMARY KEY, -- should use generated always as identity
PollId INT NOT NULL, REFERENCES Polls(id),
OptionNumber int,
Option text,
UNIQUE (PollId, Option)
);
那么你的 Votes
表应该有对 PollOptions
的外键引用.您可以使用 PollOptionId
或 (PollId, Option)
.如果正确设置数据,则不需要触发器或特殊功能。
关于sql - PostgreSQL - 基于另一个表中的列的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63406273/