Jak zaktualizować kolumnę tożsamości w SQL Server?

Mam bazę danych SQL Server i chcę zmienić kolumnę identity, ponieważ zaczęła z dużą liczbą 10010 i jest to związane z inną tabelą, teraz mam 200 rekordów i chcę rozwiązać ten problem, zanim rekordy wzrosną.

Jaki jest najlepszy sposób, aby zmienić lub zresetować tę kolumnę?

Author: a_horse_with_no_name, 2013-10-03

12 answers

SQL Server nie pozwala na aktualizację wartości kolumny identity w przeciwieństwie do co można zrobić z normalnymi kolumnami. Nie jest więc możliwe zaktualizowanie wartości kolumny identity.

Chociaż istnieją pewne alternatywy, aby spełnić podobne wymagania. Jednym z nich jest:

USE DBCC CHECKIDENT

DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)

Jeśli chcesz zaktualizować wartość kolumny identity istniejących rekordów, musisz 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
 188
Author: Sachin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-03 08:14:45

Jeśli dobrze zrozumiałeś twoje pytanie, chcesz zrobić coś takiego

update table
set identity_column_name = some value

Powiem ci, że nie jest to łatwy proces i nie jest wskazane, aby go używać, ponieważ mogą być na nim związane niektóre foreign key.

Ale oto kroki, aby to zrobić, proszę wziąć back-up z tabeli

Krok 1-Wybierz widok projektu tabeli

Tutaj wpisz opis obrazka

Krok 2-Wyłącz kolumnę tożsamości

Tutaj wpisz opis obrazka

Teraz możesz użyć zapytania update.

Teraz redo Krok 1 i krok 2 and Turn on the identity column

Numer referencyjny

 43
Author: Luv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 10:00:13

Musisz

set identity_insert YourTable ON

Następnie Usuń wiersz i włóż go ponownie z inną tożsamością.

Po wykonaniu wstawki nie zapomnij wyłączyć identiti_insert

set identity_insert YourTable OFF
 35
Author: R S P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 11:57:35
--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
 9
Author: kuklei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 11:47:01

Spróbuj użyć DBCC CHECKIDENT:

DBCC CHECKIDENT ('YourTable', RESEED, 1);
 4
Author: Darren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 09:41:38

Skopiuj tabelę do nowej tabeli bez kolumny identity.

    select columns into newtable from yourtable

Dodaj kolumnę tożsamości do newtable za pomocą new seed i utwórz ją jako klucz główny

    ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY
 4
Author: user4002899,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 06:41:06

Możesz również użyć SET IDENTITY INSERT aby umożliwić wstawianie wartości do kolumny tożsamość.

Przykład:

SET IDENTITY_INSERT dbo.Tool ON
GO

A następnie możesz wstawić do kolumny identity potrzebne wartości.

 2
Author: DaveShaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 09:43:09
DBCC CHECKIDENT(table_name, RESEED, value)

Table_name = podaj tabelę, którą chcesz zresetować

Wartość = wartość początkowa wynosi zero, aby rozpocząć kolumnę tożsamości od 1

 2
Author: Yasmeen Ansari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 07:50:33

(kompletne rozwiązanie dla programistów c# korzystających z command builder)

Po pierwsze, musisz znać te fakty: -W każdym razie nie możesz modyfikować kolumny identity, więc musisz usunąć wiersz i ponownie dodać nowy identuty. -Nie można usunąć właściwości identity z kolumny (trzeba by usunąć do kolumny) - Custom command builder z. Net zawsze pomija kolumnę identity, więc nie można jej użyć do tego celu.

Więc, raz wiedząc, że, co Ty muszę to zrobić. Albo zaprogramuj własną instrukcję SQL Insert, albo program, który posiadasz insert Command builder. Albo użyj tego, który dla Ciebie zaprogramowałem. Po podaniu tabeli danych 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 (); ;
        }
 1
Author: Juan_Mallorca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-14 12:52:08

Rozwiązałem ten problem najpierw za pomocą DBCC, a następnie za pomocą insert. Na przykład, jeśli twoja tabela To

Najpierw ustaw nową bieżącą wartość ID w tabeli jako NEW_RESEED_VALUE

MyTable { IDCol, colA, colB }

    DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE)

Wtedy możesz użyć

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

Powieliłoby to wszystkie rekordy, ale używając nowej wartości IDCol zaczynającej się od NEW_RESEED_VALUE. Możesz następnie usunąć duplikaty wierszy o wyższej wartości ID po usunięciu/przeniesieniu ich odniesień do kluczy obcych, jeśli każdy.

 0
Author: Softec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-14 11:46:43

Możesz utworzyć nową tabelę używając poniższego 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 : Kolumny 1 i column2 reprezentują wszystkie kolumny w starej tabeli, które chcesz zachować w nowej tabeli.

 0
Author: Sean H. Worthington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 23:05:38
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

Jednak powyższy kod działa tylko wtedy, gdy nie ma relacji klucz główny-obcy

 0
Author: Jekin Kalariya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-27 07:13:11