【问题标题】:how can unique constraint modified in postgresql for column 'A' not unique over same value in column B and unique over different values for column B?如何在 postgresql 中为列“A”修改的唯一约束在 B 列中的相同值上不唯一并且在 B 列的不同值上不唯一?
【发布时间】:2022-01-25 11:09:55
【问题描述】:

问题:在表格中;第 1 列对于第 2 列的相同值不是唯一的,但第 1 列的值对于第 2 列的不同值是唯一的。如何在 postgreSQL db 中实现此条件。

说明

假设表1存在于DB中

表 1

Column A Column B Extra
One apple green
One apple blue
Two apple pink
Three orange purple

对于列 B 为“苹果”,如果在列 A 中存在值“一”,那么对于列 B 的任何其他值,列 A 将不具有“一”。
示例:表 2 中的元素不应存在

表2

Column A Column B Extra
One orange red

**Extra 列可以有任何值

【问题讨论】:

  • 如果你想禁止/排除存在于另一个表中的值:这只能通过触发器来完成。
  • 这是一个糟糕的设计,是 DB 标准化到更高 NF 的那种设计。

标签: postgresql unique-constraint


【解决方案1】:

您可以通过正确规范化数据模型来解决问题:


CREATE TABLE part_2 (
   column_a text PRIMARY KEY,
   column_b text NOT NULL
)

CREATE TABLE part_2 (
   column_a text REFERENCES part_2,
   extra text NOT NULL
);

part2 仍然缺少主键。)

那么你的桌子会被这样拆分:

part_1:

column_a column_b
One apple
Two apple
Three orange

part_2:

column_a extra
One green
One blue
Two pink
Three purple

现在技术上不可能添加column_a 相同但column_b 不同的数据,您的问题就解决了。

如果要保留原始表格格式,请使用视图:

CREATE VIEW total AS
SELECT column_a, part_1.column_b, part_2.extra
FROM part_1 JOIN part_2 USING (column_a);

【讨论】:

    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2020-03-02
    • 2020-04-21
    • 2021-11-11
    相关资源
    最近更新 更多