Как обновить колонку Identity в SQL Server?

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

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

Ответ 1

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

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

ИСПОЛЬЗОВАТЬ DBCC CHECKIDENT

DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)

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

set identity_insert YourTable ON
Пример

Example

-- 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

Ответ 2

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

update table
set identity_column_name = some value

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

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

Шаг 1 - Выбор вида конструкции таблицы

enter image description here

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

enter image description here

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

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

Ссылка

Ответ 3

Вам нужно

set identity_insert YourTable ON

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

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

set identity_insert YourTable OFF

Ответ 4

--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

Ответ 5

Попробуйте использовать DBCC CHECKIDENT:

DBCC CHECKIDENT ('YourTable', RESEED, 1);

Ответ 6

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

    select columns into newtable from yourtable

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

    ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

Ответ 7

DBCC CHECKIDENT(table_name, RESEED, value)

table_name = укажите таблицу, в которой вы хотите reset значение

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

Ответ 8

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

Пример:

SET IDENTITY_INSERT dbo.Tool ON
GO

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

Ответ 9

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

Прежде всего, вы должны знать следующие факты:

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

Итак, однажды узнав об этом, вы должны это сделать. Либо запрограммируйте свой собственный оператор вставки SQL, либо запрограммируйте собственный построитель команд вставки. Или используйте тот, который я запрограммировал для вас. При наличии DataTable генерирует скрипт 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 ();
}

Ответ 10

ALTER TABLE tablename add newcolumn int
update tablename set newcolumn=existingcolumnname
ALTER TABLE tablename DROP COLUMN existingcolumnname;
EXEC sp_RENAME 'tablename.oldcolumn' , 'newcolumnname', 'COLUMN'
update tablename set newcolumnname=value where condition

Однако приведенный выше код работает, только если нет отношения первичного-внешнего ключа

Ответ 11

Я решил эту проблему сначала с помощью DBCC, а затем с помощью insert. Например, если ваша таблица

Сначала установите новое текущее значение ID в таблице как NEW_RESEED_VALUE

MyTable { IDCol, COLA, colB }

    DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE)

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

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

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

Ответ 12

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

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

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

Ответ 13

SET IDENTITY_INSERT dbo.TableName ON
INSERT INTO dbo.TableName 
(
    TableId, ColumnName1, ColumnName2, ColumnName3
)
VALUES
(
    TableId_Value, ColumnName1_Value, ColumnName2_Value, ColumnName3_Value
)

SET IDENTITY_INSERT dbo.TableName OFF

При использовании Identity_Insert не забудьте включить имена столбцов, потому что sql не позволит вам вставить без указания их