2013-10-03 7 views
95

У меня есть база данных SQL Server, и я хочу изменить столбец идентификатора, потому что он начал с большим числом 10010 и связан с другой таблицей, теперь у меня 200 записей, и я хочу исправить эту проблему до того, как записи увеличатся.Как обновить столбцы Identity в SQL Server?

Каков наилучший способ изменить или сбросить этот столбец?

ответ

144

SQL Server не позволяет обновлять значение столбца идентификаторов в отличие от , что вы можете сделать с обычными колоннами. Таким образом, невозможно обновить значение столбца идентификатора.

Хотя есть некоторые альтернативы для выполнения аналогичных требований. Один из них:

USE DBCC CHECKIDENT

DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE) 

Если вы хотите обновить значение столбца идентификации существующих записей, то вам необходимо установить

set identity_insert YourTable ON 

Пример

-- 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 Сброс следующей новой записи, но теперь я хочу изменить существующие записи. –

+0

Можете ли вы привести пример, пожалуйста? –

+0

Sheesh this saved me ... – TheGeekZn

2

Вы также можете использовать SET IDENTITY INSERT, чтобы вы могли вставлять значения в идентификационную колоду млн.

Пример:

SET IDENTITY_INSERT dbo.Tool ON 
GO 

И тогда вы можете вставить в столбец идентификации значения вам нужно.

34

Если есть ваш вопрос правильно, вы хотите сделать что-то вроде

update table 
set identity_column_name = some value 

Позвольте мне сказать вам, что это не простой процесс, и это не рекомендуется использовать его, так как там могут быть некоторые foreign key связаны с Это.

Но вот шаги, чтобы сделать это, пожалуйста, back-up таблицы

Шаг 1- Выбрать вид дизайн таблицы

enter image description here

Шаг 2 Выключите столбец идентификаторов

enter image description here

Теперь вы можете использовать update qu чень.

Теперь redo шаг 1 и шаг 2 и включение столбца идентификации

Reference

+0

У меня есть другая таблица, связанная с этой таблицей, я не могу этого сделать –

+3

Следовательно, утверждение *** не рекомендуется *** ':)' – Luv

+2

@AbdusalamElsherif Но вы спросили, как изменить столбец идентификатора. – Paparazzi

26

Вы должны

set identity_insert YourTable ON 

Затем удалите строку и вставьте его с другим именем.

После того, как вы сделали вставки не забудьте включить IDENTITY_INSERT от

set identity_insert YourTable OFF 
+2

аккуратное решение, поскольку вы не можете обновить идентификационный столбец –

+0

Это намного проще и безопаснее, чем отключить Identity для столбца! –

+0

Спасибо, это самый простой способ сделать это :) – zackrspv

2
DBCC CHECKIDENT(table_name, RESEED, value) 

table_name = дать таблицу, которую необходимо сбросить значение, значение

= начальное значение равно нулю, для запуска идентификационной колонны с 1

1

(Полное решение для программистов C# с использованием командного застройщика)

Прежде всего, вы должны знать следующие факты: - В любом случае вы не можете изменить столбец идентификатора, поэтому вам нужно удалить строку и повторно добавить с новым идентификатором. -Вы не можете удалить свойство идентификации из столбца (вам нужно будет удалить его в столбец) -Пользователь командной строки из .net всегда пропускает столбец идентификатора, поэтому вы не можете использовать его для этого пурпуса.

Итак, когда-то зная, что вам нужно делать. Либо запрограммируйте свой собственный оператор SQL Insert, либо создайте собственный встроенный конструктор команд. Или используйте этот, который я запрограммировал для вас. Учитывая DatatTable, генерирует сценарий 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

Я решил эту проблему, во-первых, с помощью DBCC, а затем с помощью вставки. Например, если ваша таблица

Сначала установите новый текущий ID Значение на столе, как NEW_RESEED_VALUE

MyTable { IDCol, Колы colB }

DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE) 

, то вы можете использовать

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

Это будет дублировать все ваши записи, но с использованием новых IDC значение ol начиная с NEW_RESEED_VALUE. Затем вы можете удалить более строгие строки с идентификатором ID, если вы удалили/переместили ссылки на внешние ключи, если таковые имеются.

+0

Это приличная идея, но New_reseed_value - это текущее семя, а следующее число, которое будет использовано, будет на 1 больше этого значения. Поэтому, если вы хотите, чтобы следующая вставленная строка была идентификатором 10, тогда значение NEW_RESEED_VALUE должно быть установлено равным 9. – LarryBud

3

скопируйте таблицу в новую таблицу без столбца идентификации.

select columns into newtable from yourtable 

добавить столбец идентификации Новая_таблица с новыми семенами и сделать его в качестве первичного ключа

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

Просто подсказка о производительности, если таблица очень большая, вместо того, чтобы делать удаление в таблице, сделайте таблицу Truncate yourTable. Это мгновенно. Будьте осторожны, но не поворачивайте назад с усечением, так как он не зарегистрирован. – kuklei

0

Вы можете создать новую таблицу, используя следующий код.

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

Затем удалите старый db и переименуйте новый db в имя старого db. Примечание: этот столбец1 и столбец2 представляют все столбцы старой таблицы, которые вы хотите сохранить в своей новой таблице.

Смежные вопросы