【问题标题】:PSQL unique constraint on two columns两列上的 PSQL 唯一约束
【发布时间】:2013-01-21 14:45:08
【问题描述】:

我有一个表,我用它以一对多的关系将另外两个表链接在一起。

TableA
id
name

TableB
id
name

LinkTable
TableA_id
TableB_id

基本上,一个 TableA 可以有多个 TableB。很简单。我现在的问题是创建一个遵循这种关系规则的约束:

LinkTable
TableA_id    TableB_id
1            1
1            2
1            3
2            1
2            2
2            3

我想创建一个唯一约束,将两个列组合在一起作为唯一值。所以在上面的链接表中,有了这个新的约束,我可以

INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 4);
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 5);
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (2, 6);
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (3, 1);

With out any problems

And if I try to insert:

INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 1);
INSERT INTO LinkTable (TableA_id, TableB_id) VALUES (1, 3);

约束将触发,因为已经有一行包含 1,1 和 1,3。我将如何创建一个 postgres 约束来做到这一点?如果我对两行都设置了唯一约束,那么我不能有多个相同的 TableA_id 和多个相同的 TableB_id。

解决办法是什么?

【问题讨论】:

  • The constraint will fire because there is already a row with 1,1 and 1,3. 你在哪里看到这样的行?
  • @Ozzy - 仅供参考,这不是 PL/SQL,而是 SQL。所有 DDL lk create、alter 等...都是 SQL 的一部分。
  • 我意识到这一点,但我指定了 psql 以防有一种 psql 独特的方式来编写唯一约束。更安全然后抱歉:)

标签: sql constraints unique relationship psql


【解决方案1】:

您是否尝试过将两列都设置为唯一的?

ALTER TABLE LinkTable 
ADD CONSTRAINT LinkTable_Unique UNIQUE (TableA_id, TableB_id);

【讨论】:

    【解决方案2】:
    create table LinkTable (
        TableA_id integer REFERENCES TableA(id),
        TableB_Id integer REFERENCES TableB(id),
        UNIQUE(tableA_id, tableB_id)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2012-08-10
      相关资源
      最近更新 更多