代码之家  ›  专栏  ›  技术社区  ›  Jacinto Resende

当使用唯一的非空列时,我真的需要主键吗?

  •  1
  • Jacinto Resende  · 技术社区  · 6 年前

    PRIMARY KEY 在下列情况下。我创建了一个表来支持ISO国家信息。我用的是MariaDB 10,但我相信这与我的问题无关(?)

    CREATE TABLE IF NOT EXISTS python.country
    (
       iso_code    INTEGER(   3) NOT NULL     ,
       iso_2_alpha VARCHAR(   2) NOT NULL     ,
       iso_3_alpha VARCHAR(   3) NOT NULL     ,
       short_name  VARCHAR(  32) NOT NULL     ,
       long_name   VARCHAR(  64) NOT NULL     ,
       flag_link   VARCHAR(2000) DEFAULT(NULL),
    
       CONSTRAINT  CK_iso_code       CHECK       (iso_code > 0 AND iso_code <= 999)                                ,
       CONSTRAINT  CK_iso_alpha      CHECK       (
                                                  iso_2_alpha RLIKE BINARY '^[A-Z]+$' AND LENGTH(iso_2_alpha) = 2 
                                                  AND 
                                                  iso_3_alpha RLIKE BINARY '^[A-Z]+$' AND LENGTH(iso_3_alpha) = 3
                                                 )                                                                 ,  
       CONSTRAINT  CK_names          CHECK       (
                                                  short_name RLIKE '^\\p{L}+(\\.?[[:blank:]]\\p{L}+)*\\p{L}+$'
                                                  AND 
                                                  long_name  RLIKE '^\\p{L}+(\\.?[[:blank:]]\\p{L}+)*\\p{L}+$'
                                                 )                                                                 ,
       CONSTRAINT  UN_short_name     UNIQUE      (short_name)                                                      ,
       CONSTRAINT  UN_long_name      UNIQUE      (long_name)                                                       ,
       CONSTRAINT  UN_iso_2_alpha    UNIQUE      (iso_2_alpha)                                                     ,
       CONSTRAINT  UN_iso_3_alpha    UNIQUE      (iso_3_alpha)                                                       
       -- ???
       -- CONSTRAINT  PK_country        PRIMARY KEY (iso_code,iso_2_alpha,iso_3_alpha)
    
    ); -- ENGINE = 'InnoDB';
    

    iso_code , iso_2_alpha iso_3_alpha )是吗 NOT NULL UNIQUE 主键 ? 我“相信”插入新元素是浪费时间和空间?

    问题2:我能用吗 iso\U代码 FOREIGN KEY 在另一张桌子上?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Damien_The_Unbeliever    6 年前

    既然所有的主列(isou code、isou 2alpha、isou 3alpha)都不是空的并且是唯一的,那么创建复合主键有意义吗?我“相信”插入新元素是浪费时间和空间?

    作为其他表中的外键,我可以安全地使用iso\ U代码吗?

    如果你也标记 iso_code 作为此表中的唯一键,应该可以正常工作。

    有些人会建议每个表总是有一个自动生成的列标记为PK。那很好只要你 强制执行逻辑键。不幸的是,许多人只会创建自动PK而没有其他键,这意味着你的数据是胡说八道。

    您已经选择(当前)只使用逻辑键。我认为在这种情况下,这是好的,尤其是作为几个( iso\U代码 iso_2_alpha iso_3_alpha )可能比推荐的自动生成列更紧凑。

        2
  •  0
  •   PKCS12    6 年前

    不能评论性能和效率,但复合键的一点是,当您将它们用作主键时,必须在外键中重复它们。即,PK iso\u code、iso\u 2\u alpha、iso\u 3\u alpha将是所有相关表中的附加FK列。然后还必须在SQL查询中按这3列进行查询。当您可以简单地使用一个通用的、唯一的自生成列时,这有点像PITA IMO。