2008-09-20 103 views
97

我想向现有旧数据库添加一列,然后编写一个过程,通过该过程可以为每条记录分配一个不同的值。就像添加一列并为其自动生成数据一样。如果我添加一个名为“ID”(数字)的新列,我想为每个记录初始化一个唯一值。所以,我的ID列将有从1到1000的记录。我该怎么做?向现有表添加一列,并为其添加唯一编号

+2

这将是数据库特定的。你应该指定你正在使用的数据库。 – dvorak 2008-09-20 13:59:25

+0

我正在SQL Server中工作。 – 2008-09-20 14:04:10

+1

你应该编辑你的问题来提一提。 – dvorak 2008-09-20 14:07:54

回答

176

这将取决于数据库上,但为SQL Server,这可以实现如下:

alter table Example 
add NewColumn int identity(1,1) 
+5

这工作很好,并添加了我需要的所有数字自动。谢谢! – djangofan 2011-10-24 20:42:32

+7

如果您在管理工作室gui中进行更改时遇到问题,您可以更改/ Tools/Options/Designer/Table和Database Desiger下的设置,您将发现一个复选框`Prevent'保存需要重新创建表的更改`取消选中该框和您即使使用gui也能够添加标识列。 – surfmuggle 2012-11-05 19:28:12

0

取决于数据库的每个数据库都有一个不同的方式来增加序列数字。我会改变表格来添加列,然后在groovy/python/etc中编写一个数据库脚本来读取数据并使用序列更新id。一旦数据被设置,我会添加一个序列到顶部数字之后开始的表格。一旦数据已经设置好,请正确设置主键。

10

甲骨文你可以做类似下面

alter table mytable add (myfield integer); 

update mytable set myfield = rownum; 
19

,如果你发布你所使用的SQL数据库,这将有助于。对于MySQL你可能想要auto_increment:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

不知道这是否适用于追溯值虽然。如果不是,你应该只能用存储过程或简单的程序迭代你的值(只要没有其他人正在写入数据库)并设置使用LAST_INSERT_ID()函数来生成id值。

5

而且Postgres的当量(第二行是强制的前提是你想要的“ID”是一个关键):

ALTER TABLE tableName ADD id SERIAL; 
ALTER TABLE tableName ADD PRIMARY KEY (id); 
0

如果你不想让你的新列是IDENTITY类型(自动增量),或者您想要详细说明行的编号顺序,您可以添加一个类型为INT NULL的列,然后像这样填充它。在我的示例中,新列名为MyNewColumn,表的现有主键列名为MyPrimaryKey。

UPDATE MyTable 
SET MyTable.MyNewColumn = AutoTable.AutoNum 
FROM 
(
    SELECT MyPrimaryKey, 
    ROW_NUMBER() OVER (ORDER BY SomeColumn, SomeOtherColumn) AS AutoNum 
    FROM MyTable 
) AutoTable 
WHERE MyTable.MyPrimaryKey = AutoTable.MyPrimaryKey 

这个作品在SQL Sever的2005及更高版本,即版本支持ROW_NUMBER()

0

在SQL Server UNIQUEIDENTIFIER数据类型如果你想创建出的该主键试试这个

Alter table table_name 
add ID UNIQUEIDENTIFIER not null unique default(newid()) 

列使用此

ALTER TABLE table_name 
ADD CONSTRAINT PK_name PRIMARY KEY (ID);