none
Wie kann ich eine Spalte nachträglich als Identity machen. RRS feed

  • Frage

  • Hallo NG,

    ich habe mit dem SQL-Server Management eine Datenbank per Daten importieren vom SQL-Server 2008 nach SQL-Server 2016 importiert.

    Bei einer Tabelle ist die Spalte zwar übernommen nur ist Sie nicht als Identity eigetragen.

    Wie kann ich bei einer bestehenden Tabelle die Identity nachträglich setzen. Ich muss die bestehenden Werte behalten weil Tabellen darauf zugreifen.

    Danke im voraus für jeden Hinweis und Tipp.

    Ingo

    Donnerstag, 3. November 2016 14:38

Antworten

  • Hallo Ingo,

    hier mal ein Walk Through. Ist nur eine Möglichkeit. Alternativ kannst Du die Daten ja auch in eine neue Tabelle laufen lassen und die anschließend umbenennen. Aber damit erhöhst Du das Transaktionsvolumen...

    -- Anlegen einer Tabelle OHNE Identity
    CREATE TABLE dbo.demo_table
    (
    	Id	int	NOT NULL,
    	C1	CHAR(100) NOT NULL DEFAULT ('Test')
    
    	-- Bei Constraints wird es etwas komplizierter als
    	-- mit einem Index!
    	CONSTRAINT pk_demo_table PRIMARY KEY CLUSTERED (Id)
    );
    GO
    
    SET NOCOUNT ON;
    GO
    
    -- Testdaten eintragen
    INSERT INTO dbo.demo_table WITH (TABLOCK) (Id, C1)
    SELECT	ROW_NUMBER() OVER (ORDER BY message_id),
    		CAST(text AS CHAR(100))
    FROM	sys.messages
    WHERE	language_id = 1033;
    GO
    
    -- Schritt 1: Anlegen eines neuen Attributs
    ALTER TABLE dbo.demo_table
    ADD new_Id INT NOT NULL IDENTITY (1, 1);
    GO
    
    -- Löschen der alten ID und Umbenennen von new_id
    ALTER TABLE dbo.demo_table DROP CONSTRAINT pk_demo_table;
    GO
    
    ALTER TABLE dbo.demo_table DROP COLUMN [Id];
    GO
    
    -- Umbenennen der bestehenden Spalte
    EXEC sp_rename N'dbo.demo_table.new_id',
    			N'id',
    			N'COLUMN';
    GO
    
    ALTER TABLE dbo.demo_table
    ADD CONSTRAINT pk_demo_table PRIMARY KEY CLUSTERED (Id);
    GO
    
    SELECT * FROM dbo.demo_table;
    GO
    


    Uwe Ricken (Blog | Twitter)
    Microsoft Certiied Master - SQL Server 2008
    Microsoft Certified Solution Master - CHARTER Data Platform
    Microsoft Certified Solution Expert - Data Platform
    db Berater GmbH
    Microsoft SQL Server Blog (german only)

    Freitag, 4. November 2016 11:05
  • Hallo Ingo,

    es ist nicht möglich, bei einer vorhandenen Spalte diese mit der Identity Eigenschaft zu versehen; siehe ALTER TABLE (Transact-SQL) => ALTER COLUMN Optionen; Datentypen & Nullable & Collation kann man ändern, Identity nicht.

    So arbeitet der Import/Export Wizard, er übernimmt nur die platte Tabellendefinition, aber keine erweiterten Eigenschaft und auch nicht so was wie Primary Key, Indizes oder Statistiken.

    Am besten die Tabelle vorher so anlegen, wie man sie braucht und erst danach Daten importieren; im Wizard gibt es die Option, das Identity Werte beim Import beibehalten werden.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 3. November 2016 14:56

Alle Antworten

  • Hallo Ingo,

    es ist nicht möglich, bei einer vorhandenen Spalte diese mit der Identity Eigenschaft zu versehen; siehe ALTER TABLE (Transact-SQL) => ALTER COLUMN Optionen; Datentypen & Nullable & Collation kann man ändern, Identity nicht.

    So arbeitet der Import/Export Wizard, er übernimmt nur die platte Tabellendefinition, aber keine erweiterten Eigenschaft und auch nicht so was wie Primary Key, Indizes oder Statistiken.

    Am besten die Tabelle vorher so anlegen, wie man sie braucht und erst danach Daten importieren; im Wizard gibt es die Option, das Identity Werte beim Import beibehalten werden.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 3. November 2016 14:56
  • Hallo Olaf,

    danke für den Hinweis.

    Ich versuche nun eine leere Tabelle zu erstellen und dann mit IDENTITY_INSERT die Daten dort hin zu kopieren. 

    Grüße Ingo

    Donnerstag, 3. November 2016 15:49
  • Hallo Ingo,

    hier mal ein Walk Through. Ist nur eine Möglichkeit. Alternativ kannst Du die Daten ja auch in eine neue Tabelle laufen lassen und die anschließend umbenennen. Aber damit erhöhst Du das Transaktionsvolumen...

    -- Anlegen einer Tabelle OHNE Identity
    CREATE TABLE dbo.demo_table
    (
    	Id	int	NOT NULL,
    	C1	CHAR(100) NOT NULL DEFAULT ('Test')
    
    	-- Bei Constraints wird es etwas komplizierter als
    	-- mit einem Index!
    	CONSTRAINT pk_demo_table PRIMARY KEY CLUSTERED (Id)
    );
    GO
    
    SET NOCOUNT ON;
    GO
    
    -- Testdaten eintragen
    INSERT INTO dbo.demo_table WITH (TABLOCK) (Id, C1)
    SELECT	ROW_NUMBER() OVER (ORDER BY message_id),
    		CAST(text AS CHAR(100))
    FROM	sys.messages
    WHERE	language_id = 1033;
    GO
    
    -- Schritt 1: Anlegen eines neuen Attributs
    ALTER TABLE dbo.demo_table
    ADD new_Id INT NOT NULL IDENTITY (1, 1);
    GO
    
    -- Löschen der alten ID und Umbenennen von new_id
    ALTER TABLE dbo.demo_table DROP CONSTRAINT pk_demo_table;
    GO
    
    ALTER TABLE dbo.demo_table DROP COLUMN [Id];
    GO
    
    -- Umbenennen der bestehenden Spalte
    EXEC sp_rename N'dbo.demo_table.new_id',
    			N'id',
    			N'COLUMN';
    GO
    
    ALTER TABLE dbo.demo_table
    ADD CONSTRAINT pk_demo_table PRIMARY KEY CLUSTERED (Id);
    GO
    
    SELECT * FROM dbo.demo_table;
    GO
    


    Uwe Ricken (Blog | Twitter)
    Microsoft Certiied Master - SQL Server 2008
    Microsoft Certified Solution Master - CHARTER Data Platform
    Microsoft Certified Solution Expert - Data Platform
    db Berater GmbH
    Microsoft SQL Server Blog (german only)

    Freitag, 4. November 2016 11:05
  • Hallo Uwe

    ja so habe ich es auch gemacht.

    Danke für den Tipp

    Montag, 14. November 2016 15:56
  • Hallo Uwe

    ja so habe ich es auch gemacht.

    Danke für den Tipp

    Guten Morgen Ingo,

    dann sei doch so gut und markiere die Einträge, die Dir geholfen haben, als [Antwort]. Das hat zwei Vorteile:

    - der Thread wird als "beantwortet" markiert und die Leute, die hier freiwillig helfen, müssen nicht mehr in den Thread schauen (ist ja gelöst)

    - diejenigen, dessen Meldung Du als Antwort markierst, wissen, dass sie helfen konnten.

    Vielen Dank...


    Uwe Ricken (Blog | Twitter)
    Microsoft Certiied Master - SQL Server 2008
    Microsoft Certified Solution Master - CHARTER Data Platform
    Microsoft Certified Solution Expert - Data Platform
    db Berater GmbH
    Microsoft SQL Server Blog (german only)

    Dienstag, 15. November 2016 03:36