PostgreSQL - 基于另一个表中的列的约束

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 语句手动查询相应的民意调查,然后在插入投票表之前断言“值”有效,是否同样具有性能?

Gor*_*off 2

我建议您修改数据模型以拥有一个表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)

如果正确设置数据,则不需要触发器或特殊功能。