2009-03-27 23 views
6

Potrzebuję zmienić JEDNĄ wartość PK w jednym wierszu tabeli SQLSERVER 2005 databsae. Obecnie PK automatycznie się zwiększa.Zaktualizuj kolumnę autoinkrementacji w serwerze SQL

Jedną z możliwości jest tymczasowe usunięcie auto-inkrementacji z klucza, wykonanie modyfikacji i odłożenie.

Baza danych jest w produkcji. Czy istnieje sposób, aby bezpiecznie dokonać tej zmiany bez obniżenia DB?

Dlaczego? Mój klient chce określonego identyfikatora dla jednego z rekordów.

Czego się boję? Obawiam się, że rekordy są dodawane w DB, podczas gdy ja modyfikowałem klucz i to jakoś zepsuje indeks na innej tabeli, która używa pola jako FK? Czy ja jestem szalony?

+1

Nie należy zapominać, że wszelkie tabele odwołujące się do tego klucza podstawowego będą musiały zostać zaktualizowane do nowej wartości, zanim będzie można usunąć stary wiersz. – mrdenny

Odpowiedz

14

Aktualizacja nie działa - trzeba by wstawić nowy rekord i usunąć starą zamiast ...

set identity_insert mytable on 

insert mytable (myidentitycolumn, someothercolumn) 
select 42, someothercolumn 
from mytable 
where myidentitycolumn = 1; 

delete mytable where myidentitycolumn = 1; 

set identity_insert mytable off 
+0

To nie działa = "Nie można zaktualizować kolumny tożsamości XXXXX" –

+0

matt - masz rację. odpowiedź została odpowiednio zaktualizowana, a także +1 do twojej odpowiedzi. –

+0

Pozdrawiam, warto już iść :) –

4

Można aktualizować tylko poprzez usunięcie tożsamości i ponowne jej utworzenie. Można jednak również ustawić opcję Wstawianie tożsamości (http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx) i wstawić nowy wiersz z żądaną wartością identyfikacyjną, wyłączyć tę funkcję, a następnie usunąć starą. Dlaczego chcesz to zrobić?

3
SET IDENTITY_INSERT yourTable ON 

INSERT INTO yourTable (col1, col2, col3) 
select newID, col2, col3 
FROM yourTable 
WHERE currentID = xxx 

SET IDENTITY_INSERT yourTable OFF 

Możesz zablokować tabeli, aby zapobiec inne wstawki z awaria podczas gdy IDENTITY_INSERT jest włączone.

EDIT: No cóż, zapomniałem trochę o usunięciu oryginalnego rekordu.

0
DECLARE @counter int 
SET @counter = 0 
UPDATE #tmp_Users 
SET @counter = counter = @counter + 1 
+0

Edytuj i uzyskaj więcej informacji. Tylko kod i odpowiedź "spróbuj tego" są odradzane, ponieważ nie zawierają treści do wyszukiwania i nie wyjaśniają, dlaczego ktoś powinien "spróbować tego". – abarisone

+0

Ta odpowiedź pojawiła się w kolejce do sprawdzania niskiej jakości, prawdopodobnie dlatego, że nie podano żadnego wyjaśnienia kodu. Jeśli ten kod odpowiada na pytanie, rozważ dodanie dodania tekstu wyjaśniającego kod w odpowiedzi. W ten sposób znacznie bardziej prawdopodobne jest, że uzyskasz więcej upvotes - i pomożesz osobie pytającej nauczyć się czegoś nowego. – lmo

Powiązane problemy