我在向表中添加另一个主键时遇到问题。 我有3列:
当我制作表格时,我有这个使帐户ID和电子邮件ID唯一。
PRIMARY KEY (AccountID, EmailID)
我认为这会让我的emailid变得独一无二,但是在我尝试插入另一行同一个emailid之后,它就完成了。 所以我以为我错过了一些东西。
现在我的问题:
答案 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)
如果AccountID
和EmailID
都是候选键,则只有一个可以是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是否真的有必要。