SQL 2008 复合主键,部分键自动递增

发布于 2024-12-08 11:40:10 字数 597 浏览 0 评论 0原文

具有复合主键的简单表。
PK1smallint,PK2smallint 自动递增,strValue varchar(20) 不为 null。

这有效,但 PK2 独立于 PK1 递增。

我希望PK2能够以全新的PK1重新开始。

这是我得到的

    1, 1, 1a
    1, 2, 1b
    2, 3, 2a
    2, 4, 2b

我想要的

    1, 1, 1a
    1, 2, 1b
    2, 1, 2a
    2, 2, 2b 

我需要从 PK2 中删除自动增量并在 Insert 语句上生成正确的值?这是到达那里的正确方法吗?您是否推荐 Insert 语句的语法?自动增量 PK1 不是一个选项,因为它是 FK 关系的一部分。

假设我需要插入 2, x, 3b 并且需要知道为 x 分配了什么值。
不会有很多插入(例如 100 个/天)。 PK1 有一个唯一的约束,strValue。

需要明确的是,我认为 SQL 2008 正在做正确的事情,并不是建议 SQL 默认情况下应该这样做。

Simple table with composite primary key.
PK1 smallint, PK2 smallint auto increment, strValue varchar(20) not null.

This works but PK2 increments independent of PK1.

What I would like is for PK2 to start fresh with a fresh PK1.

Here is what I get

    1, 1, 1a
    1, 2, 1b
    2, 3, 2a
    2, 4, 2b

What I want

    1, 1, 1a
    1, 2, 1b
    2, 1, 2a
    2, 2, 2b 

I take it I need to remove the auto increment from PK2 and generate the proper value on the Insert statement? Is that the correct way to get there and do you recommend syntax for the Insert statement? Auto increment PK1 is not an option as it is part of FK relationship.

Assume I need to insert 2, x, 3b and need to know what value was assigned for x.
There are NOT going to be a lot of inserts (like 100 / day).
There is a unique constraint on PK1, strValue.

To be clear I think SQL 2008 is doing the right thing and am not suggesting that SQL should behave this way by default.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

她说她爱他 2024-12-15 11:40:10

如果您没有对表进行大量插入,您可以删除标识列并简单地执行以下操作:

IF NOT EXISTS ( SELECT * FROM table WHERE PK1 = 2 AND strValue = '3b' )
BEGIN
  DECLARE @next_PK2 INT

  SELECT
    @next_PK2 = ISNULL(MAX(PK2) + 1, 0) + 1
  FROM
    table
  WHERE
    PK1 = 2

  INSERT table VALUES (2, @next_PK2, '3b')
END

If you're not doing a lot of inserts to the table you can probably remove the identity column and simply do:

IF NOT EXISTS ( SELECT * FROM table WHERE PK1 = 2 AND strValue = '3b' )
BEGIN
  DECLARE @next_PK2 INT

  SELECT
    @next_PK2 = ISNULL(MAX(PK2) + 1, 0) + 1
  FROM
    table
  WHERE
    PK1 = 2

  INSERT table VALUES (2, @next_PK2, '3b')
END
你丑哭了我 2024-12-15 11:40:10

是的,如果您想控制 PK2 的增量值,您需要在插入期间生成该值(例如使用 ROW_NUMBER())。没有任何其他方法可以独立设置 PK2。

Yes, if you want to control the incremental value of PK2 you need to generate that during insert (such as with a ROW_NUMBER(). There isn't any other way to set the PK2 independently.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文