【问题标题】:Set two primary keys but reset the second primary key for each first primary key value - SQL Server [duplicate]设置两个主键,但为每个第一个主键值重置第二个主键 - SQL Server [重复]
【发布时间】:2018-07-09 19:29:26
【问题描述】:

我正在尝试为产品创建评论部分。我正在为Comments 表设置两个主键CommentIDProductID。但是我想要对主键做的事情如下:对于每个ProductIDCommentID 应该从头开始计数。所以对于ProductID = 1CommentID 应该从 1 开始并递增,对于ProductID = 2CommentID 也应该从 1 开始并递增,依此类推。同时ProductID 是指向 Product 表的外键。

有人可以指导我如何存档,这是一种好的做法还是存在更好的解决方法,除了制作两个主键?

谢谢!

【问题讨论】:

标签: sql-server sql-server-2017 sql-server-2017-express


【解决方案1】:

我会使用IDENTITY 列/序列(单PK):

CREATE TABLE comments(comment_id INT IDENTITY(1,1) PRIMARY KEY,  
                      product_id INT REFERENCES Product(product_id),
                      some_text VARCHAR(1000),
                      -- ...
                      );

然后选择:

SELECT *,
   ROW_NUMBER() OVER(ORDER BY comment_id) AS rn 
  -- if you really need consecutive numbers
FROM comments
WHERE product_id = ?

【讨论】:

  • 一个愚蠢的问题。在这种情况下如何进行插入?我的意思是,我每次插入时都必须指定 PRoductID!
  • 引用有什么作用?它与外键有什么不同?
  • @Tinaira Yesm 你必须指定 ProductId。 REFERENCES 是外键的内联版本。
  • 好的。但据我所知,CommentID 将独立于 ProductID 递增。所以当我选择不同的产品来评论时它不会重新开始
  • 我现在理解你的代码了。您在 select 语句中添加的列只是关于 productid 的最高 commentid 编号。起初有点令人困惑,因为我期待别的东西,但现在它是有道理的
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多