2013-10-03 13 views

Odpowiedz

144

SQL Server nie pozwala na aktualizację wartości kolumna tożsamości w przeciwieństwie co można zrobić z normalnych kolumn. Tak więc nie można aktualizować wartości kolumny tożsamości.

Mimo że istnieją pewne alternatywy, aby spełnić podobny wymóg. Jednym z nich jest:

USE DBCC CHECKIDENT

DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE) 

Jeśli chcesz zaktualizować wartość kolumny tożsamości istniejących zapisów wtedy trzeba ustawić

set identity_insert YourTable ON 

Przykład

-- Set Identity insert on so that value can be inserted into this column 
SET IDENTITY_INSERT YourTable ON 
GO 
-- Insert the record which you want to update with new value in identity column 
INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue') 
GO 
-- Delete the old row of which you have inserted a copy (above) (make sure about FK's) 
DELETE FROM YourTable WHERE ID=3 
GO 
--Now set the idenetity_insert OFF to back to prevoius track 
SET IDENTITY_INSERT YourTable OFF 
+1

DBCC Zresetuj następny nowy rekord, ale co chcę teraz zmienić istniejące rekordy. –

+0

czy możesz podać przykład, proszę? –

+0

Sheesh to uratowało mnie ... – TheGeekZn

2

Można również użyć SET IDENTITY INSERT, aby umożliwić wstawianie wartości do identyfikatora mn.

Przykład:

SET IDENTITY_INSERT dbo.Tool ON 
GO 

a następnie można wstawić do kolumny tożsamości wartości potrzebne.

34

Jeśli mam pytanie prawy chcesz zrobić coś takiego

update table 
set identity_column_name = some value 

Powiem wam, że nie jest to łatwy proces i nie jest wskazane, aby go używać, ponieważ nie mogą być pewne foreign key związany na to.

Ale tutaj są kroki, aby to zrobić, proszę wziąć back-up tabeli

Krok 1 Wybierz widoku projektu tabeli

enter image description here

Krok 2 Wyłącz kolumny tożsamości

enter image description here

Teraz możesz użyć update qu ery.

Teraz redo krok 1 i krok 2 i włącz kolumny tożsamości

Reference

+0

Mam inną tabelę związaną z tą tabelą, nie mogę tego zrobić. –

+3

Stąd stwierdzenie *** nie jest zalecane *** ':)' – Luv

+2

@AbdusalamElsherif Ale zapytałeś, jak zmienić kolumnę tożsamości. – Paparazzi

26

Trzeba

set identity_insert YourTable ON 

Następnie usunąć wiersz i włóż ją z inną tożsamością.

Po wykonaniu wkładka nie zapomnij włączyć IDENTITY_INSERT off

set identity_insert YourTable OFF 
+2

zadowalające rozwiązanie, ponieważ nie możesz zaktualizować kolumny tożsamości –

+0

Jest to o wiele łatwiejsze i bezpieczniejsze niż wyłączenie Tożsamości dla kolumny! –

+0

Dziękuję, jest to zdecydowanie najłatwiejszy sposób na zrobienie tego :) – zackrspv

2
DBCC CHECKIDENT(table_name, RESEED, value) 

table_name = dać tabelę chcesz zresetować wartość

wartość = wartość początkowa wynosi zero, Aby rozpocząć kolumnę tożsamości z 1

1

(Kompletne rozwiązanie dla programistów C# przy użyciu programu budującego polecenia)

Przede wszystkim musisz znać te fakty: - W żadnym wypadku nie możesz modyfikować kolumny tożsamości, więc musisz usunąć wiersz i dodać go ponownie z nowym identyfikatorem. -Nie można usunąć właściwości tożsamości z kolumny (trzeba by usunąć do kolumny) - Niestandardowy program budujący polecenia z .net zawsze pomija kolumnę tożsamości, więc nie można jej używać w tym celu.

Tak więc, wiedząc o tym, co musisz zrobić, to. Albo zaprogramuj własną instrukcję SQL Insert, albo program, który posiadasz własny builder poleceń. Lub użyj tej, którą zaprogramowałem dla ciebie. Biorąc pod uwagę DatatTable, generuje skrypt SQL Insert:

public static string BuildInsertSQLText (DataTable table) 
     { 
      StringBuilder sql = new StringBuilder(1000,5000000); 
      StringBuilder values = new StringBuilder ("VALUES ("); 
      bool bFirst = true; 
      bool bIdentity = false; 
      string identityType = null; 

      foreach(DataRow myRow in table.Rows) 
      { 
       sql.Append("\r\nINSERT INTO " + table.TableName + " ("); 

       foreach (DataColumn column in table.Columns) 
       { 
        if (column.AutoIncrement) 
        { 
         bIdentity = true; 

         switch (column.DataType.Name) 
         { 
          case "Int16": 
           identityType = "smallint"; 
           break; 
          case "SByte": 
           identityType = "tinyint"; 
           break; 
          case "Int64": 
           identityType = "bigint"; 
           break; 
          case "Decimal": 
           identityType = "decimal"; 
           break; 
          default: 
           identityType = "int"; 
           break; 
         } 
        } 
        else 
        { 
         if (bFirst) 
          bFirst = false; 
         else 
         { 
          sql.Append (", "); 
          values.Append (", "); 
         } 
sql.Append ("["); 
         sql.Append (column.ColumnName); 
sql.Append ("]"); 

         //values.Append (myRow[column.ColumnName].ToString()); 

         if (myRow[column.ColumnName].ToString() == "True") 
          values.Append("1"); 
         else if (myRow[column.ColumnName].ToString() == "False") 
          values.Append("0"); 
         else 
         if(myRow[column.ColumnName] == System.DBNull.Value)  
          values.Append ("NULL"); 
         else 
         if(column.DataType.ToString().Equals("System.String")) 
         { 
          values.Append ("'"+myRow[column.ColumnName].ToString()+"'"); 
         } else 
         values.Append (myRow[column.ColumnName].ToString()); 
         //values.Append (column.DataType.ToString()); 
        } 
       } 
       sql.Append (") "); 
       sql.Append (values.ToString()); 
       sql.Append (")"); 

       if (bIdentity) 
       { 
        sql.Append ("; SELECT CAST(scope_identity() AS "); 
        sql.Append (identityType); 
        sql.Append (")"); 
       } 
      bFirst = true; 
sql.Append(";"); 
       values = new StringBuilder ("VALUES ("); 
      }//fin foreach 
      return sql.ToString(); ; 
     } 
0

Mam rozwiązać ten problem za pomocą DBCC po pierwsze, a następnie za pomocą wkładki. Na przykład, jeśli tabela jest

wstępie ustaw nowy prąd ID Wartość na stole jako NEW_RESEED_VALUE

MojaTabela { IDCol, Cola, colB }

DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE) 

następnie można wykorzystać

insert into MyTable (colA, ColB) select colA, colB from MyTable 

Powieliłoby to wszystkie twoje rekordy, ale używając nowego IDC ol wartość zaczynająca się jako NEW_RESEED_VALUE. Następnie można usunąć wyższy identyfikator Wartość duplikatów wierszy po usunięciu/przeniesieniu ich odwołań do kluczy obcych, jeśli takie istnieją.

+0

To przyzwoity pomysł, ale wartość New_reseed_value jest bieżącym nasieniem, a następna liczba, która będzie używana, będzie o 1 większa od tej wartości. Jeśli chcesz, aby następny wstawiony wiersz był identyfikatorem 10, wtedy NEW_RESEED_VALUE musi być ustawiony na 9. – LarryBud

3

skopiuj tabelę do nowej tabeli bez kolumny tożsamości.

select columns into newtable from yourtable 

dodać kolumnę tożsamości do newtable z nowym materiałem siewnym i uczynić go jako klucza podstawowego

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY 
8
--before running this make sure Foreign key constraints have been removed that reference the ID. 

--set table to allow identity to be inserted 
SET IDENTITY_INSERT yourTable ON; 
GO 
--insert everything into a temp table 
SELECT * 
INTO #tmpYourTable 
FROM yourTable 

--clear your table 
DELETE FROM yourTable 
--insert back all the values with the updated ID column 
INSERT INTO yourTable (IDCol, OtherCols) 
SELECT ID+1 as updatedID --put any other update logic to the ID here 
, OtherCols FROM #tmpYourTable 
--drop the temp table 
DROP TABLE #tmpYourTable 
--put identity back to normal 
SET IDENTITY_INSERT yourTable OFF; 
GO 
+0

Tylko wskazówka dotycząca wydajności, jeśli tabela jest bardzo duża, zamiast robić usuwanie na stole, wykonaj tabelę skrótu w tabeli. To jest natychmiastowe. Ostrożnie, nie ma odwrotu z przyciętym, ponieważ nie jest zalogowany. – kuklei

0

Można utworzyć nową tabelę za pomocą następującego kodu.

SELECT IDENTITY (int, 1, 1) AS id, column1, column2 
INTO dbo.NewTable 
FROM dbo.OldTable 

Następnie usuń stary db i zmień nazwę nowego db na nazwę starego db. Uwaga: ta kolumna1 i kolumna2 reprezentują wszystkie kolumny w starej tabeli, które chcesz zachować w nowej tabeli.

Powiązane problemy