如何在不使用'身份的情况下手动填充空值。 SQL表中的命令

时间:2017-02-24 15:50:12

标签: sql sql-server

我创建了表格' test':

create table test  
(  
    column1 varchar(10),  
    column2 varchar(10),  
)  

并添加了值

insert into test values('value1','value2')
insert into test values('value1','value2')

但是现在我需要创建一个将成为主键的列,但我不能使用' Identity'命令,因为控件将由应用程序完成。

alter table test add ID int

如何填充null值,使它们按顺序排列?它们在哪里为空。

来自&{39; select * from test':

column1 column2 ID

value1 value2 NULL
value1 value2 NULL

4 个答案:

答案 0 :(得分:4)

试试这个

;WITH cte
AS
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY column1, column2) AS RowNum FROM test
)
UPDATE cte
    SET iID = RowNum

现在检查你的表记录

SELECT * FROM test

答案 1 :(得分:2)

你可以这样做:

  1. 添加可以为空的列Id
  2. 使用值
  3. 更新Id
  4. Id设为not null
  5. Id设为primary key
  6. create table test (
        column1 varchar(10)
      , column2 varchar(10)
    );
    
    insert into test values
     ('value1','value2')
    ,('value1','value2');
    
    alter table test add Id int null;
    
    update t set Id = rn 
      from (
        select *
          , rn = row_number() over (order by column1, column2)
        from test
      ) as t;
    
    alter table test alter column Id int not null;
    
    alter table test
      add constraint pk_test primary key clustered (Id);
    
    select * from test;
    

    测试设置:http://rextester.com/DCB57058

    结果:

    +---------+---------+----+
    | column1 | column2 | Id |
    +---------+---------+----+
    | value1  | value2  |  1 |
    | value1  | value2  |  2 |
    +---------+---------+----+
    

答案 2 :(得分:0)

添加临时标识列,将此列中的值复制到ID,然后删除临时列:

CREATE TABLE #test
(
    column1 varchar(10),
    column2 varchar(10),
)

INSERT INTO #test
VALUES
('aa','aa'),
('bb','bb')

ALTER TABLE #test 
    ADD ID INT

ALTER TABLE #test 
    ADD TempID INT IDENTITY(1,1)

UPDATE t
SET
    t.ID = t.TempID
FROM #test t

ALTER TABLE #test
DROP COLUMN TempID  

SELECT *
FROM #test t

DROP TABLE #test

答案 3 :(得分:0)

首先,您无法使用NULL值(check MSDN here)创建PK。

如果您想让您的应用程序创建您的PK值,您必须在INSERT时间给它或在您的应用程序编辑它之前给出一些“默认”值。由于各种原因,第二种选择是危险的(相信你的应用程序以确保单一性?你将如何在短时间内进行大量的INSERT等等)。