sql-server - länge - wordpress title tag ändern




Wie ändern Sie Identitätsspaltenwerte programmgesteuert? (9)

Über die Benutzeroberfläche in SQL Server 2005-Manager, ändern Sie die Spalte entfernen Sie die Eigenschaftsnummer (Identität) -Eigenschaft der Spalte (wählen Sie die Tabelle, indem Sie mit der rechten Maustaste darauf und wählen Sie "Design").

Führen Sie dann Ihre Abfrage aus:

UPDATE table SET Id = Id + 1

Dann gehen Sie und fügen Sie der Spalte die Eigenschaft autonumber zurück.

Ich habe eine MS SQL 2005 Datenbank mit einer Tabelle Test mit Spalten ID . ID ist eine Identitätsspalte.

Ich habe Zeilen in dieser Tabelle und alle von ihnen haben ihre entsprechenden ID Autoincremened Wert.

Jetzt möchte ich jede ID in dieser Tabelle so ändern:

ID = ID + 1

Aber wenn ich das mache, bekomme ich einen Fehler:

Cannot update identity column 'ID'.

Ich habe es versucht:

ALTER TABLE Test NOCHECK CONSTRAINT ALL 
set identity_insert ID ON

Aber das löst das Problem nicht.

Ich muss Identität auf diese Spalte festgelegt haben, aber ich muss auch von Zeit zu Zeit Werte ändern. Meine Frage ist also, wie ich diese Aufgabe erfüllen soll.


DBCC CHECKIDENT ('datenbankname.dbo.orders', RESEED, 999) Sie können jede Identitätsspaltennummer mit diesem Befehl ändern, und Sie können diese Feldnummer auch von jeder gewünschten Nummer aus starten. Beispiel: In meinem Befehl möchte ich von beginnen 1000 (999 + 1) hoffe, dass es reichen würde ... viel Glück


Dies kann mit einer temporären Tabelle geschehen.

Die Idee

  • Einschränkungen deaktivieren (falls Ihre ID von einem Fremdschlüssel referenziert wird)
  • Erstellen Sie eine temporäre Tabelle mit der neuen ID
  • Löschen Sie den Tabelleninhalt
  • Kopieren Sie Daten aus der kopierten Tabelle in Ihre ursprüngliche Tabelle
  • Aktivieren Sie zuvor deaktivierte Einschränkungen

SQL-Abfragen

Nehmen wir an, Ihre column2 hat zwei zusätzliche Spalten ( column2 und column3 ), und es gibt zwei Tabellen mit Fremdverweistabelle, die auf die test foreign_table1 foreign_table2 foreign_table1 und foreign_table2 (weil Probleme im wirklichen Leben nie einfach sind).

alter table test nocheck constraint all;
alter table foreign_table1 nocheck constraint all;
alter table foreign_table2 nocheck constraint all;
set identity_insert test on;

select id + 1 as id, column2, column3 into test_copy from test v;
delete from test;
insert into test(id, column2, column3)
select id, column2, column3 from test_copy

alter table test check constraint all;
alter table foreign_table1 check constraint all;
alter table foreign_table2 check constraint all;
set identity_insert test off;
drop table test_copy;

Das ist es.


Du brauchst

set identity_insert YourTable ON

Löschen Sie dann Ihre Zeile und fügen Sie sie erneut mit einer anderen Identität ein.

Vergessen Sie nach dem Einfügen nicht, identity_insert auszuschalten

set identity_insert YourTable OFF

Ich habe einen guten Artikel gesehen, der mir im letzten Moment geholfen hat. Ich habe versucht, ein paar Zeilen in eine Tabelle einzufügen, die eine Identity-Spalte hatte, aber sie hat es falsch gemacht und muss sie wieder löschen. Sobald ich die Zeilen gelöscht habe, wurde meine Identitätsspalte geändert. Ich habe versucht, einen Weg zu finden, die Spalte zu aktualisieren, die eingefügt wurde, aber - kein Glück. Also, während der Suche auf Google einen Link gefunden ..

  1. Gelöschte Spalten, die falsch eingefügt wurden
  2. Verwenden Sie force insert mit Identität ein / aus (unten erläutert)

http://beyondrelational.com/modules/2/blogs/28/posts/10337/sql-server-how-do-i-insert-an-explicit-value-into-an-identity-column-how-do-i-update-the-value-of-an.aspx


Sehr nette Frage, zuerst müssen wir auf IDENTITY_INSERT für die spezifische Tabelle, danach die Einfügeabfrage ausführen (muss den Spaltennamen angeben).

Hinweis: Nachdem Sie die Identitätsspalte bearbeitet haben, vergessen Sie nicht, IDENTITY_INSERT zu deaktivieren. Wenn Sie dies nicht getan haben, können Sie die Identitätsspalte für keine andere Tabelle bearbeiten.

SET IDENTITY_INSERT Emp_tb_gb_Menu ON
     INSERT Emp_tb_gb_Menu(MenuID) VALUES (68)
SET IDENTITY_INSERT Emp_tb_gb_Menu OFF

http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html


Speichern Sie zuerst alle IDs und ändern Sie sie programmatisch auf die Werte, die Sie möchten, entfernen Sie sie dann aus der Datenbank und fügen Sie sie dann erneut ein, indem Sie etwas Ähnliches verwenden:

use [Name.Database]
go
set identity_insert [Test] ON
insert into [dbo].[Test]
           ([Id])
     VALUES
           (2)
set identity_insert [Test] OFF

Für Masseneinsatz verwenden:

use [Name.Database]
go
set identity_insert [Test] ON
BULK INSERT [Test]
FROM 'C:\Users\Oscar\file.csv'
WITH (FIELDTERMINATOR = ';',
      ROWTERMINATOR = '\n',
      KEEPIDENTITY)
set identity_insert [Test] OFF

Beispieldaten von file.csv:

2;
3;
4;
5;
6;

Wenn Sie identity_insert auf off setzen, erhalten Sie den folgenden Fehler:

Der explizite Wert für die Identitätsspalte kann in der Tabelle "Test" nicht eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist.


Wenn Sie die IDs gelegentlich ändern müssen, ist es wahrscheinlich am besten, keine Identitätsspalte zu verwenden. In der Vergangenheit haben wir automatische Nummerierungsfelder manuell implementiert, indem wir eine "Counters" -Tabelle verwenden, die die nächste ID für jede Tabelle verfolgt. IIRC haben wir getan, weil Identitätsspalten in SQL2000 eine Datenbankbeschädigung verursacht haben, aber die Möglichkeit, IDs zu ändern, war gelegentlich zum Testen nützlich.


IDENTITY Spaltenwerte sind unveränderbar.

Es ist jedoch möglich, die Metadaten der Tabelle zu IDENTITY , um die IDENTITY Eigenschaft zu entfernen, die Aktualisierung IDENTITY und dann zurück zu wechseln.

Die folgende Struktur vorausgesetzt

CREATE TABLE Test
(
ID INT IDENTITY(1,1) PRIMARY KEY,
X VARCHAR(10)
)

INSERT INTO Test 
OUTPUT INSERTED.*
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'

Dann kannst du es tun

/*Define table with same structure but no IDENTITY*/
CREATE TABLE Temp
(
ID INT PRIMARY KEY,
X VARCHAR(10)
)

/*Switch table metadata to new structure*/
ALTER TABLE Test SWITCH TO Temp;

/*Do the update*/
UPDATE Temp SET ID = ID + 1;

/*Switch table metadata back*/
ALTER TABLE Temp SWITCH TO Test;

/*ID values have been updated*/
SELECT *
FROM Test

/*Safety check in case error in preceding step*/
IF NOT EXISTS(SELECT * FROM Temp)
    DROP TABLE Temp /*Drop obsolete table*/

In SQL Server 2012 ist es möglich, eine automatisch inkrementierende Spalte zu haben, die auch einfacher mit SEQUENCES aktualisiert werden kann

CREATE SEQUENCE Seq
    AS INT
    START WITH 1
    INCREMENT BY 1

CREATE TABLE Test2
(
ID INT DEFAULT NEXT VALUE FOR Seq NOT NULL PRIMARY KEY,
X VARCHAR(10)
)

INSERT INTO Test2(X)
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'

UPDATE Test2 SET ID+=1




sql-server-2005-express