use*_*450 6 sql postgresql triggers constraints foreign-keys
我有两张桌子,一张称为选票,一张称为投票。选票存储代表人们可以投票的选项的字符串列表:
CREATE TABLE IF NOT EXISTS Polls (
id SERIAL PRIMARY KEY,
options text[]
);
Run Code Online (Sandbox Code Playgroud)
投票存储用户所做的投票(其中投票是代表他们投票的选项索引的整数):
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
);
Run Code Online (Sandbox Code Playgroud)
我想确保每当在 Votes 表中创建一行时,“value”的值都在 Polls 中相应行的 [0,length(options)) 范围内(相应的,我的意思是 poll_id 所在的行)匹配)。
我可以实施任何类型的检查或外键约束来实现此目的吗?或者我需要某种触发器?如果是这样,该触发器会是什么样子?是否会存在性能问题?使用 SELECT 语句手动查询相应的民意调查,然后在插入投票表之前断言“值”有效,是否同样具有性能?
我建议您修改数据模型以拥有一个表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)
);
Run Code Online (Sandbox Code Playgroud)
那么你的Votes表应该有一个外键引用PollOptions。您可以使用PollOptionId或(PollId, Option)。
如果正确设置数据,则不需要触发器或特殊功能。