我有一个表来保持用户对商品的评分。 我想允许每个用户只对项目评分一次,有没有办法强制数据库不允许重复itemId和userId?
我不希望每个单独的字段都是主键。 我希望主键同时基于它们。 例如,有一行:
itemId= 1 & userId = 1
应该允许以下:
itemId= 2 & userId = 1
itemId= 1 & userId = 2
以下不应该被允许:
itemId= 1 & userId = 1
答案 0 :(得分:3)
是。在itemId和userId上创建主键。
要在T-SQL(SQL Server)中执行此操作,您可以使用以下内容:
CREATE TABLE rating (
itemId int NOT NULL
CONSTRAINT fk_rating_item FOREIGN KEY REFERENCES item ( itemId ),
userId int NOT NULL
CONSTRAINT fk_rating_user FOREIGN KEY REFERENCES [user] ( userId ),
thumbsUp int,
thumbsDown int,
CONSTRAINT pk_rating PRIMARY KEY ( itemId, userId )
)
(这假设您的商品表是'商品'而您的用户表是'用户'。)
我不确定为什么你的拇指和拇指都有价值?如果这是一个布尔值,你可能只需要一个:如果竖起大拇指为0,那么无论如何都会有所帮助。
编辑:复合键的定义
当您在一个表中的两列上创建主键时,这意味着它只需要对两个值都是唯一的,即只要每个userId不同,它将允许具有相同itemId的任意数量的行,反之亦然。
两者的组合必须是唯一的,而不是单独的每个部分。
答案 1 :(得分:0)
大多数数据库将允许由多列组成的复合主键。您使用的是哪个数据库?
一个有趣的相关讨论:What are the down sides of using a composite/compound primary key?
mySQL类型示例:
createuserratings.sql
CREATE TABLE USERRATINGS
(
itemId INT NOT NULL,
userId INT NOT NULL,
thumbsUp INT NOT NULL,
thumbsDown INT NOT NULL,
PRIMARY KEY (itemID, userID)
);
在mySQL文档中搜索复合/复合主键,你应该获得很多信息(我不使用mySQL)。
答案 2 :(得分:0)
使用复合主键(由2列组成的主键)。
CREATE TABLE Rating
(
itemID INT NOT NULL
,userID INT NOT NULL
,thumbsUP INT NOT NULL
,thumbsDown INT NOT NULL
,PRIMARY KEY (itemID, userID)
);