【问题标题】:Interchangeable, composite primary keys可互换的复合主键
【发布时间】:2016-11-10 04:28:15
【问题描述】:

我有一个表foo,它只有两个字段:fooIdAfooIdB(都属于同一类型)。这些是复合主键,所以:

primary key (fooIdA, fooIdB)...

考虑到这一点,我怎样才能使键的所有排列都相同?
(fooIdA, fooIdB) = (fooIdB, fooIdA)

【问题讨论】:

  • 你的意思是当你插入一个主键来插入它的另一个排列时?
  • @αNerd 不,我希望另一个排列被认为是第一个排列的重复。
  • 您可以使用触发器来检查其他组合是否已经存在。

标签: sql composite-primary-key


【解决方案1】:

根据您的 DBMS,您可以在表达式上创建唯一索引,以防止插入 (1,2)(2,1)

在 Postgres 和 Oracle 中,您可以这样做:

create unique index unique_combinations 
    on the_table (least(fooida, fooidb), greatest(fooida, fooidb));

【讨论】:

    【解决方案2】:

    您没有指定您的 RDBMS。您还可以添加具有 MAX、MIN 值的计算字段,并在这些计算字段上添加 UNIQUE 约束。下面是 MSSQL 示例:

    CREATE TABLE ATest (id1 int, id2 int);
    
    ALTER TABLE ATest ADD idMax AS (CASE WHEN id1>=id2 THEN id1 ELSE id2 END);  
    ALTER TABLE ATest ADD idMin AS (CASE WHEN id1>=id2 THEN id2 ELSE id1 END);  
    ALTER TABLE ATest ADD CONSTRAINT UniqueConstCalc UNIQUE(idMax,idMin);
    
    insert into ATest values (1,1);
    insert into ATest values (1,2);
    insert into ATest values (2,1);
    
    (1 row(s) affected)
    
    (1 row(s) affected)
    
    Msg 2627, Level 14, State 1, Line 3
    Violation of UNIQUE KEY constraint 'UniqueConstCalc'. 
    Cannot insert duplicate key in object 'dbo.ATest'. 
    The duplicate key value is (2, 1).
    The statement has been terminated.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      相关资源
      最近更新 更多