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

标签 sql postgresql triggers foreign-keys constraints

我有两张 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/

相关文章:

sql - 如何通过单个测试检查 null/空/空白值?

postgresql - docker postgres初始化脚本似乎无法创建db用户,命令被忽略

postgresql - Postgres ltree 查询中的 Cstring

mysql - 如何抑制mysql中的插入

sql - 创建触发器数据的临时表

sql - 如果表中的两列具有相同的值,则获取单行

c# - 将 LINQ-to-Entities 查询组合成单个查询

mysql - 对前 N 行进行分组,但还需要对列值求和

postgresql - 将行类型的所有列重置为 NULL

c# - 附加属性 + 样式 -> ArgumentNullException