将另一个主键添加到UNIQUE表中

时间:2011-03-09 16:00:08

标签: sql-server sql-server-2008 primary-key

我在向表中添加另一个主键时遇到问题。 我有3列:

  1. 帐户ID(身份)
  2. EmailID
  3. 数据字段
  4. 当我制作表格时,我有这个使帐户ID和电子邮件ID唯一。

    PRIMARY KEY (AccountID, EmailID)
    

    我认为这会让我的emailid变得独一无二,但是在我尝试插入另一行同一个emailid之后,它就完成了。 所以我以为我错过了一些东西。

    现在我的问题:

    1. 如果我不得不使用alter,如何更改表/ PK约束以修改EmailID字段并使其成为唯一?
    2. 如果我决定放弃桌子并换上新桌子,我该如何让这两个主键独一无二?

4 个答案:

答案 0 :(得分:6)

您可以更改表格并在EmailID列上添加新的UNIQUE CONSTRAINT

-- This will create a constraint which enforces that the field EmailID
-- have unique values
ALTER TABLE Your_Table_Name
ADD CONSTRAINT unique_constraint_name UNIQUE (EmailID)

值得注意的是,更改表以添加此新唯一约束并不意味着您必须删除为(AccountID,EmailID)对添加的其他PRIMARY KEY约束。当然,除非您的业务逻辑决定它,否则。

当您对(AcountID,EmailID)进行PRIMARY KEY分组时,它指定AcountID和EmailID都参与唯一标识该表中的每个单独记录。因此,这意味着您可以在表格中包含以下记录:

 AccountID  |  EmailID                  |  Other Fields
----------------------------------------------------------
 100        |  user@company.com         |     ....
 101        |  user2@othermail.com      |     ....
 100        |  user_alternate@mail.com  |     ....

在前面的示例中,可以有两个具有相同AccountID的记录,这是有效的,因为PRIMARY KEY指定只有(AccountID,EmailID)对必须是唯一的 - 它是唯一的。它没有规定AccountID是独立的。

总之,您可能希望在AccountID上添加另一个UNIQUE约束。或者简单地将AccountID单独作为PRIMARY KEY,然后在EmailID上添加UNIQUE约束。

答案 1 :(得分:2)

如果AccountIDEmailID都是候选键,则只有一个可以是PK,另一个则需要唯一约束。

从SQL Server的POV中选择哪一个作为PK并不重要。外键可以引用PK或唯一约束但是假设PK默认情况下是聚簇索引,选择AccountID可能是有意义的,因为这可能更窄且更稳定。

答案 2 :(得分:0)

这听起来像是一个不正确的主键。 eMID更有可能是您的自然密钥,但出于某种原因(可能是您组织中的开发标准?)您想使用代理ID,AccountID,但您仍然希望电子邮件ID和代理ID都是唯一的和一对一的关系。如果这是真的,那么您的主键应该是AccountID,您应该在EmailID上放置一个唯一约束。

答案 3 :(得分:0)

如果您要重新创建表格,它可能看起来像这样。我假设EmailID引用的是电子邮件表而不是电子邮件地址。

CREATE TABLE dbo.AccountEmails
(
    AccountID int not null identity(1,1),
    EmailID int not null,
    Data varchar(max) null,
    constraint PK_AccountEmails PRIMARY KEY //this is a unique single column primary key
    (
        AccountID
    ),
    constraint FK_AccountEmails_EmailID FOREIGN KEY dbo.Email(EmailID) ON //this makes sure EmailID exists in the Email table
    (
        EmailID
    ),
    constraint UQ_AccountEmails_EmailID UNIQUE //unique single column unique constraint
    (
        EmailID
    ),
    constraint UQ_AccountEmails_AccountID_EmailID UNIQUE //the combination of AccountID and EmailID is also unique
    (
        AccountID,
        EmailID
    )
)

鉴于AccountID和EmailID都是独立的,我不确定UQ_AccountEmails_AccountID_EmailID是否真的有必要。