我创建了表格' 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
答案 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)
你可以这样做:
Id
Id
Id
设为not null
Id
设为primary key
。 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等等)。