【问题标题】:SQL - Trying to insert a new column in an existing table where the values are auto incremented by 1 starting from 50SQL - 尝试在现有表中插入新列,其中值从 50 开始自动递增 1
【发布时间】:2019-02-01 15:04:02
【问题描述】:
 ALTER TABLE advance_d ADD testcolumn INTEGER NOT NULL AUTO_INCREMENT;

这是我输入的 sql 代码。我有一个名为 advace_d 的表。它有一个名为 "ad_id" 的主键列。当我编写此代码ALTER TABLE advance_d ADD testcolumn INTEGER; 时,创建了一个带有空值的新列。我想知道如何使用从给定值开始自动递增 1 的值创建列。

所以我的表将有 1 个主键列作为 ID,另一列的值从 50 开始递增 1。

【问题讨论】:

  • 关于哪个列,您希望这个新序列开始?我认为我们需要知道这一点才能给出任何有意义的答案。
  • 添加行号...这听起来像是您应该在查询或应用程序级别而不是在数据本身中执行的任务。
  • 希望将新列添加到具有现有主键列的表中。因此,当我尝试添加具有自动增量的列时,它会显示不正确的表定义;只能有一个自动列,并且必须定义为一个键
  • @MattClark 不希望更改列的自动增量值。更像是我想创建一个具有自定义自动增量值的新列,而不是更改现有的内容

标签: mysql sql sql-server sqlite


【解决方案1】:

我知道如何做到这一点的唯一方法是插入具有自动递增列的表中。我不知道如何对现有表执行此操作,但您可以创建一个新表,然后将前一个表复制到其中,在此过程中填充自动增量列:

CREATE TABLE newTable (col1, col2, ..., colAuto INT NOT NULL AUTO_INCREMENT);
INSERT INTO newTable (col1, col2, ..., colAuto)
SELECT col1, col2, ..., NULL   -- NULL for colAuto
FROM yourTable
ORDER BY ad_id;

这应该会生成一个包含相同数据的新表,以及一个以 1 开头的列 colAuto,按照原始表中的 ad_id 列的顺序。在此之后,如果您不想再自动递增,您可以更改 colAuto。如果原始表格不再有任何用途,您也可以将其删除。

编辑:

我们也可以使用行号会话变量来做到这一点:

SET @rn := 0;
UPDATE yourTable
SET colAuto = (SELECT @rn := @rn + 1 )
ORDER BY ad_id;

但在实践中,对非自动增量列进行此类更新可能没有太大的商业意义。这是因为一旦向表中添加更多数据,就必须再次手动更新,但这次序列将从零以外的某个数字开始。确实,自动递增列是在 SQL 中轻松维护序列的方法。

【讨论】:

  • 嗨蒂姆。我想要做的是,在现有表中添加一个新列,并使列中的值从给定值开始,比如 50?然后将 50 递增 1,依此类推,连续行。所以我的专栏将有 50、51、52... 等等
  • ...而且,为什么我的解决方案不能做到这一点?在运行我的答案后再做一次更新,它将 49 添加到 colAuto 中的所有内容。
  • 当然可以在现有表中执行此操作,但这意味着使用会话变量(动态 SQL)。我怀疑这是否适合你,所以我建议这样做。
  • 我想这可以通过添加列(没有任何约束),使用增量值更新每一行(可能使用游标)然后添加约束来完成。这需要做更多的工作,但不需要复制整个表格。
  • @Stewie 为您提供了使用会话变量进行更新的选项。您是否更喜欢它是您的偏好。
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 2011-12-29
  • 2013-04-12
  • 2013-10-27
  • 1970-01-01
  • 2016-08-17
  • 2012-02-02
  • 2016-11-22
相关资源
最近更新 更多