【问题标题】:Add a unique constraint of a sql table as foreign key reference to an another sql table添加一个 sql 表的唯一约束作为对另一个 sql 表的外键引用
【发布时间】:2011-05-12 14:55:07
【问题描述】:

如何在 sql server 2005 中添加一个 sql 表的唯一约束作为对另一个 sql 表的外键引用

【问题讨论】:

    标签: sql-server unique-constraint


    【解决方案1】:

    为了添加 FK 约束(在子表到父表中),您必须向关系的父表列添加唯一约束。
    其余的都是可选的或与FK无关:

    • 不需要任何主键
    • 子表列不需要唯一性

    父表(在这种 FK 关系中)经常被称为(包括由 SSMS)作为主键表,但 PK 不是必须的,父表中的唯一键/约束就足够了(因为 PK 是唯一的,这是特殊情况父表中的唯一约束)。

    answer by Matt 中删除 TableA 和 TableB,这让初学者感到困惑,
    并将它们重新创建为

    CREATE TABLE parentB--TableB 
    (
        PK1 INT NOT NULL,
        PK2 INT NOT NULL,
        --I would not have additional non-referenced data in parent table, 
        --rather in child table
        --SomeData VARCHAR(1000),
    
        --CONSTRAINT PK_TableB PRIMARY KEY CLUSTERED (PK1, PK2)
    )
    
    CREATE TABLE childA--TableA 
    (
        --PK INT, -- NOT NULL,
        FK1 INT-- NOT NULL,  -- Or NULL, if you''d rather.
        FK2 INT --NOT NULL --,
        , SomeData VARCHAR(1000)
        --CONSTRAINT PK_TableA PRIMARY KEY CLUSTERED (PK),
        --CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2),
        --CONSTRAINT Cons2cols UNIQUE(FK1, FK2)
    )
    

    现在,按顺序添加 FK

    ALTER TABLE childA 
    ADD 
    --constraint FK1_childA 
    --this is optional, if one needs to add his own custom name
    FOREIGN KEY (FK1) REFERENCES parentB(PK1); 
    

    您应该首先在父表列中的相应引用列上创建唯一约束:

    ALTER TABLE parentB ADD 
    --CONSTRAINT YourUniqueName --uncomment for adding your own name to constraint
    UNIQUE(PK1) 
    

    同样适用于 2 列外键约束
    (首先,你需要在父表中对应唯一约束):

    ALTER TABLE parentB ADD 
    --CONSTRAINT YourUniqueName --for adding your own name to unique constraint
    UNIQUE(PK1,PK2)  
    
    ALTER TABLE childA 
    ADD 
    --constraint yourUniqueName --uncomment for adding your own name to FK constraint
    FOREIGN KEY (FK1, FK2) REFERENCES parentB(PK1, PK2); 
    

    【讨论】:

      【解决方案2】:

      抱歉,但我不太确定您在这里问什么。提供更多有关表定义的示例会有所帮助!我认为您是说 TableA 中有两列在名为“Cons2cols”的唯一约束中,并且您还希望这两列成为 TableB 中两列 PK / unqiue 对的 FK。

      如果您是从头开始创建表,其工作原理如下:

      CREATE TABLE TableB (
          PK1 INT NOT NULL,
          PK2 INT NOT NULL,
          SomeData VARCHAR(1000),
      
          CONSTRAINT PK_TableB PRIMARY KEY CLUSTERED (PK1, PK2)
      )
      
      CREATE TABLE TableA (
          PK INT NOT NULL,
          FK1 INT NOT NULL,  -- Or NULL, if you''d rather.
          FK2 INT NOT NULL,
          CONSTRAINT PK_TableA PRIMARY KEY CLUSTERED (PK),
          CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2),
          CONSTRAINT Cons2cols UNIQUE(FK1, FK2)
      )
      

      如果表已经存在,您可以在事后添加这些相同的约束:

      ALTER TABLE TableA ADD CONSTRAINT FK_TableA_FK1FK2 FOREIGN KEY (FK1, FK2) REFERENCES TableB (PK1, PK2);
      ALTER TABLE TableA ADD CONSTRAINT Cons2cols UNIQUE(FK1, FK2);
      

      无论哪种方式,TableA 现在都有一个唯一的 2 列 FK 到另一个表。

      【讨论】:

        【解决方案3】:

        您需要记住,在列上添加 FK 不会自动在该列上放置索引。您需要分两步完成此操作。

        1) Make a column in your table a FK to a parent table.
        2) Add a unique constraint on that same column
        

        【讨论】:

        • 但我有两个列添加到唯一约束“Cons2cols”。我想将此“Cons2cols”作为外键映射到表
        • 对不起,我不太明白你在问什么或在说什么。
        • 从谷歌上看到这个。在这类问题中,最好有一个从父表到子表的外键和一个唯一的约束,还是有一个触发器拒绝跨表不唯一的值?就性能而言,哪个是更好的选择?
        【解决方案4】:

        暂时忘记唯一约束。只需在两列上创建新的外键即可。

        ALTER TABLE dbo.PurchaseDetail
        ADD FOREIGN KEY (Customer, Product)
            REFERENCES dbo.Purchase (Customer, Product)
        

        【讨论】:

          【解决方案5】:

          我更喜欢这种表引用另一个表(transaction_log)的方法:

          CREATE TABLE transaction_settings_log
          (
              transaction_fk UUID NOT NULL
                  CONSTRAINT transaction_log_pkey REFERENCES transaction_log (id) UNIQUE,
              group_selected BOOLEAN DEFAULT TRUE,
              leg_closed     BOOLEAN DEFAULT FALSE
          );
          

          【讨论】:

            猜你喜欢
            • 2012-05-07
            • 1970-01-01
            • 1970-01-01
            • 2021-05-08
            • 2021-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-06
            相关资源
            最近更新 更多