【问题标题】:Sql query for update data into table db将数据更新到表数据库中的 SQL 查询
【发布时间】:2023-02-06 23:49:10
【问题描述】:

我在数据库中有一个这样的表: ID、姓名、Val、Pos。

01,ValueN1,10,0
01,ValueN2,5,1
01,ValueN3,6,2
01,ValueN4,7,3
01,ValueN5,10,4

我需要添加一个值:01,ValueN6,10,3

Pos 列是一个键,所以我需要重写所有值(我想)。我需要的结果是:

01,ValueN1,10,0
01,ValueN2,5,1
01,ValueN3,6,2
01,ValueN6,10,3
01,ValueN4,7,4
01,ValueN5,10,5

有一种方法?如果我简单地添加值,我会得到重复键错误,因为 pos=3 已经存在。

【问题讨论】:

  • 您将需要UPDATE所有行行,然后更改其位置,然后 INSERT 值。您需要确保在事务中执行此操作,以便在出现错误时可以回滚整个操作。
  • 虽然,如果 Pos钥匙那么我建议它不是一个好的候选者; (主)键的值不应该改变,否则保持参照完整性将成为一场噩梦。
  • 这将引起关注,一个钥匙不需要更改以适应新行。
  • 如果Pos一个(主)键,它是否被任何外键约束引用?如果是这样,那么这就变成了一个巨大的蠕虫罐头。
  • 我需要添加行但具有特定的 pos 值。 Pos 不是主键。

标签: sql sql-server


【解决方案1】:

从上面的讨论中,听起来您有一个 UNIQUE 约束定义了 Pos 列。在这种情况下,您应该能够调整其他值以适应插入,如下所示。

UPDATE YourTable
SET Pos = Pos + 1
WHERE Pos >= 3

INSERT YourTable (ID, Name, Val, Pos)
VALUES ('01', 'ValueN6', 10, 3)

如果实际上它被引用为另一个表的外键,您将需要首先验证外键定义是否使用 ON UPDATE CASCADE 选项定义。

但是,如果您的设计对排序和引用完整性使用相同的列,则可能是时候重新考虑该设计了。

【讨论】:

  • 只是在这里重复建议,这里也应该真正使用事务,以确保应用所有更改,或者不应用任何更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2017-09-19
  • 2020-11-20
相关资源
最近更新 更多