it-swarm.com.de

SQL Server fügt der vorhandenen Tabelle den automatischen Inkrementierungsprimärschlüssel hinzu

Als Titel habe ich eine vorhandene Tabelle, die bereits mit 150000 Datensätzen gefüllt ist. Ich habe eine ID-Spalte hinzugefügt (die derzeit null ist).

Ich gehe davon aus, dass ich eine Abfrage ausführen kann, um diese Spalte mit inkrementellen Zahlen zu füllen, und dann als Primärschlüssel festlegen und die automatische Inkrementierung aktivieren kann. Ist das die richtige Vorgehensweise? Und wenn ja, wie fülle ich die Anfangszahlen aus?

219

Nein - Sie müssen es umgekehrt machen: Fügen Sie es von Anfang an als INT IDENTITY hinzu - es wird mit Identitätswerten gefüllt, wenn Sie dies tun:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

und dann können Sie es zum Primärschlüssel machen:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

oder wenn Sie es vorziehen, alles in einem Schritt zu erledigen:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
385
marc_s

Sie können die IDENTITÄT nicht "einschalten": Es handelt sich um eine Tabellenwiederherstellung.

Wenn Sie sich nicht für die Reihenfolge der Nummern interessieren, fügen Sie die Spalte NOT NULL mit IDENTITY auf einmal hinzu. 150k Zeilen sind nicht viel.

Wenn Sie die Reihenfolge der Nummern beibehalten müssen, fügen Sie die Nummern entsprechend hinzu. Verwenden Sie dann den SSMS-Tabellen-Designer, um die IDENTITY-Eigenschaft festzulegen. Auf diese Weise können Sie ein Skript generieren, das das Löschen/Hinzufügen/Beibehalten von Zahlen/Neueinordnen der Spalten für Sie übernimmt.

18
gbn

Ich hatte dieses Problem, konnte jedoch keine Identitätsspalte verwenden (aus verschiedenen Gründen). Darauf habe ich mich festgelegt:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

Ausgeliehen von hier .

11
Kevin

Wenn die Spalte in Ihrer Tabelle bereits vorhanden und null ist, können Sie die Spalte mit diesem Befehl aktualisieren (ID, Tabellenname und Tabellenschlüssel ersetzen):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
4
Renzo Ciot

Wenn Ihre Tabelle über den Primär- oder Foriegen-Schlüssel in Beziehung zu anderen Tabellen steht, kann die Tabelle möglicherweise nicht geändert werden. Sie müssen also die Tabelle löschen und neu erstellen.
Um diese Probleme zu lösen, müssen Sie Skripte erstellen, indem Sie mit der rechten Maustaste auf die Datenbank klicken und in der erweiterten Option den Datentyp für das Skript zum Schema und für die Daten festlegen. Verwenden Sie anschließend dieses Skript mit der Änderung Ihrer Spalte, um die Tabelle zu identifizieren und neu zu generieren, indem Sie ihre Abfrage ausführen.
Ihre Anfrage wird hier lauten:

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 
2
Hamid

Wenn wir einer vorhandenen Tabelle eine Identitätsspalte hinzufügen, wird diese automatisch ausgefüllt, ohne dass Sie sie manuell ausfüllen müssen.

2
user3279092

vom designer kann man identität setzen (1,1) rechtsklick auf tbl => desing => teilweise linksklick (rechtsklick) => eigenschaften => in identitätsspalten #spalte auswählen

Eigenschaften

Identitätsspalte

2
gustavo herrera

Diese Antwort ist eine kleine Ergänzung zur Antwort mit der höchsten Bewertung und funktioniert für SQL Server. Bei der Frage wurde ein Auto-Inkrement-Primärschlüssel angefordert. Bei der aktuellen Antwort wird zwar der Primärschlüssel hinzugefügt, jedoch nicht als Auto-Inkrement gekennzeichnet. Das folgende Skript überprüft die Spalten und das Vorhandensein und fügt es mit aktiviertem Autoincrement-Flag hinzu.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO
0
John K.

Hier ist eine Idee, die Sie ausprobieren können. Originaltabelle - keine Identitätsspaltentabelle1 Erstellt eine neue Tabelle - ruft die Tabelle2 zusammen mit der Identitätsspalte auf. Kopieren Sie die Daten von Tabelle1 nach Tabelle2. Die Identitätsspalte wird automatisch mit automatisch inkrementierten Zahlen gefüllt.

benennen Sie die ursprüngliche Tabelle - Tabelle1 in Tabelle3 um. Benennen Sie die neue Tabelle - Tabelle2 in Tabelle1 um. Nachdem Sie sichergestellt haben, dass kein Problem vorliegt und ordnungsgemäß funktioniert, lassen Sie die Tabelle3 fallen, wenn sie nicht mehr benötigt wird.

0
JH326

Erstellen Sie eine neue Tabelle mit unterschiedlichem Namen und gleichen Spalten, Primärschlüssel- und Fremdschlüsselzuordnung und verknüpfen Sie diese in Ihrer Insert-Code-Anweisung. Für zB: Für MITARBEITER durch MITARBEITER ersetzen.

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

Sie müssen jedoch entweder die vorhandene MITARBEITER-Tabelle löschen oder einige Anpassungen gemäß Ihren Anforderungen vornehmen.

0
kumarP