【问题标题】:Unique constraint only when two columns are duplicated in a row仅当两列在一行中重复时才有唯一约束
【发布时间】:2015-09-19 03:03:03
【问题描述】:

我有一个投票表,其中包含已投票用户的公司名称和对该公司投票的用户的唯一客户编号。

用户对其他公司投票(赞成或反对)并且必须提供他们唯一的客户编号才能投票。

我想创建一个唯一约束,允许用户只投票一次,但不能对同一家公司投票两次,但是我希望相同的客户编号可以对多个查询进行投票。我只知道唯一约束,但这不起作用,因为它只允许用户在激活唯一约束时对任何公司进行一次投票。

例如(这样就好):

CompanyID  Voted(customer number)
Maccas     12345
BMW        12345
Maccas     66666

并且我想约束以下内容(通过在公司名称和客户编号相同时激活约束):

CompanyID  Voted
Maccas     12345
Maccas     12345 (should prevent duplicate of both columns co-existing)

我的代码:

string voteTable = "INSERT INTO dbo.votes (CompanyID,Voted) Values (@CompanyID,@Voted)";

canUserVote(); //checks if customer number exists

                        this.companyName = Convert.ToString(e.CommandArgument);

                        SqlCommand insertVoterDetails = new SqlCommand (voteTable,voteDb); //inserts voter details to votes table
                        insertVoterDetails.Parameters.AddWithValue("@CompanyID", this.companyName);
                        insertVoterDetails.Parameters.AddWithValue("@Voted", custVoteTextBox.Text);

感谢您的帮助!

【问题讨论】:

  • 您可以在两列上创建约束。这可以在数据库中完成:你使用什么数据库?
  • 我指的是当两列都与其他行而不是单列重复时创建约束。我正在使用 MSSQL,谢谢
  • 见下面Goel的回答。
  • @JamesS .. 你还需要什么吗?请参阅下面的答案..
  • 谢谢大家!一切正常

标签: c# sql sql-server constraints


【解决方案1】:

当您创建表时,然后按以下方式添加复合主键..

CREATE TABLE Voting
(
  [CompanyID] INT NOT NULL,
  [Voted] INT NOT NULL

  CONSTRAINT PK_CompanyVote PRIMARY KEY NONCLUSTERED ([CompanyID], [Voted])
)

或如下

create table Voting (
     CompanyID integer not null,
     Voted integer not null,
     primary key (CompanyID, Voted)
);

这是SQLFiddle,下面是为您准备的完整代码。在这里,我创建了基本的company, user and company user 表,并插入了一些虚拟记录。

注意:我还施加了外键约束,以确保您插入正确的值。但是,如果您愿意,您可以离开这部分。

创建表格

create table C
(
CompanyID int primary key,
CompanyName varchar(50)
);

Create table U
(
UserID int primary key,
UserName varchar(50)
);

Create table CU
(
CompanyID int,
UserID int,
FOREIGN KEY (CompanyID) REFERENCES C(CompanyID),
FOREIGN KEY (UserID) REFERENCES U(UserID),
primary key (CompanyID, UserID)
);

插入语句

Insert into c values (101,'Google')
Insert into c values (102,'Yahoo')
Insert into c values (103,'Microsoft')

Insert into U values (1001,'Mike')
Insert into U values (1002,'John')
Insert into U values (1003,'Hanis')

Insert into CU values (101,1001)
Insert into CU values (101,1002)
Insert into CU values (102,1002)

当我触发以下查询时,我也收到了一个错误,这在你的情况下是预期的。

Insert into CU values (102,1002)

消息 2627,级别 14,状态 1,第 1 行违反主键 约束“PK__CU__FCEF90863A56FFA3”。无法插入重复键 对象“dbo.CU”。重复键值为 (102, 1002)。该声明 已终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2020-11-13
    • 2021-08-28
    相关资源
    最近更新 更多