9

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

4

5 回答 5

11

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

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

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

从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); 
于 2010-11-21T08:22:48.253 回答
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 到另一个表。

于 2010-11-19T14:09:03.480 回答
1

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

1) Make a column in your table a FK to a parent table.
2) Add a unique constraint on that same column
于 2010-11-19T12:41:55.640 回答
0

现在忘记唯一约束。只需在两列上创建新的外键。

ALTER TABLE dbo.PurchaseDetail
ADD FOREIGN KEY (Customer, Product)
    REFERENCES dbo.Purchase (Customer, Product)
于 2010-11-21T09:17:55.777 回答
0

我更喜欢这种表引用另一个表(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
);
于 2019-07-18T08:54:27.520 回答