2015-04-18 3 views
0

Я ищу способ сброса идентификаторов первичного ключа и воссоздания данных, чтобы они сортировались по дате.SQL Server: сброс идентификатора и воссоздание данных

Перед

Pk_Col Letters_Col Date_Col 
------------------------------------------ 
1   A  2015-02-16 00:00:00.000 
2   B  2012-02-16 00:00:00.000 
3   C  2014-02-16 00:00:00.000 
1003  D  2009-02-16 00:00:00.000 
1004  E  2008-02-16 00:00:00.000 
1902  F  2016-02-16 00:00:00.000 

После/желаемого выхода

Pk_Col Letters_Col Date_Col 
------------------------------------------ 
1   E  2008-02-16 00:00:00.000 
2   D  2009-02-16 00:00:00.000 
3   B  2012-02-16 00:00:00.000 
4   C  2014-02-16 00:00:00.000 
5   A  2015-02-16 00:00:00.000 
6   F  2016-02-16 00:00:00.000 

я пытался до сих пор:

DBCC CHECKIDENT ('dbo.myTable',RESEED,0);  

INSERT INTO dbo.myTable (Letters_Col, Date_Col) 
    SELECT 
     Letters_Col, Date_Col 
    FROM 
     (DELETE FROM myTable OUTPUT deleted.*) d; 

Я должен включать в себя запрос ниже, вероятно, но у меня не было удачи выполните этот запрос успешно с воссозданием данных и сортировкой за один раз:

select * 
from myTable 
order by cast([Date_Col] as datetime) asc 

ответ

2

Это может быть опасно для сброса первичных ключей. В конце концов, они используются для отношений с внешними ключами, поэтому другая таблица может ссылаться на них. И, сам ключ не должен иметь никакого особого значения.

Однако, вы можете делать то, что вы хотите с помощью функции ранжирования и update:

with toupdate as (
     select t.*, row_number() over (order by date) as seqnum 
     from myTable t 
    ) 
update toupdate 
    set pk_Col = seqnum; 
0

Если вы хотите обновить PK_Col и нет никакого внешнего ключа:

UPDATE dbo.myTable 
SET PK_Col = (SELECT COUNT(*) 
       FROM dbo.myTable ti 
       WHERE ti.DateCol <= dbo.myTable.DateCol And 
        ti.PK_Col <= dbo.myTable.PK_Col)