SQL Server varolan tabloya otomatik artış birincil anahtarı ekle


253

Başlık olarak, zaten 150000 kayıtla dolu mevcut bir tablom var. Bir Id sütunu ekledim (şu anda null).

Ben bu sütunu artımlı sayılarla doldurmak ve sonra birincil anahtar olarak ayarlamak ve otomatik artışı açmak için bir sorgu çalıştırabilir varsayıyorum. İlerlemek için doğru yol bu mu? Ve eğer öyleyse, ilk sayıları nasıl doldururum?

Yanıtlar:


429

Hayır - bunu başka bir şekilde yapmanız gerekir: hemen gitme şeklinden ekleyin INT IDENTITY- bunu yaptığınızda kimlik değerleri ile doldurulur:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

ve sonra birincil anahtar yapabilirsiniz:

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

veya hepsini tek adımda yapmayı tercih ediyorsanız:

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

2
Bu gerçekten iyi bir cevap, ancak başlangıç ​​tamsayısını 1'den 1000'e nasıl değiştirebilirim? 1000'de saymaya başlamak istiyorum. Kullanabileceğimden şüpheleniyorum ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1ama bir uzmana danışmadan denemek istemedim :) Ref. pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
user1477388

3
Ben sadece bunu kullandım ve işe yaramış gibi görünüyoralter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
user1477388 8:13

1
@stom: hiçbir şey belirtmezseniz, seed = 1 ve increment = 1 kullanılır - bu zaten en sık kullanılan ayardır. Böyle bir tablo oluşturduysanız - iyi çalışır. Ancak SQL komut dosyalarınızdaki her zaman açıkça tohum ve artışı belirtmenizi öneririm - özellikle daha büyük bir site için. Bu sadece iyi bir uygulama.
marc_s

1
@stom: İyi, PRIMARY KEYima NOT NULLyerinde olduğundan - yani tekrar - kesinlikle gerekli değil. Ama açık olmayı tercih ederim ve bu yüzden her zaman NOT NULLorada, sadece açık olmak için
marc_s

3
@ turbo88: öğenizi tanımladığınızda PRIMARY KEY, kümelenmiş dizin sizin için otomatik olarak oluşturulur (açıkça belirtmedikçe NONCLUSTERED)
marc_s

19

KİMLİĞİ "açamazsınız": bir tablo yeniden oluşturma.

Sayı sırasını umursamıyorsanız, tek seferde KİMLİK ile NULL DEĞİL sütununu eklersiniz. 150 bin satır çok fazla değil.

Bir sayı sırasını korumanız gerekiyorsa, sayıları buna göre ekleyin. Ardından, IDENTITY özelliğini ayarlamak için SSMS tablo tasarımcısını kullanın. Bu, sizin için drop / add / keep numaraları / reseed sütununu yapacak bir komut dosyası oluşturmanıza olanak tanır.


5
OP, SQL Server 2008'de, bu yüzden bir yol var
Martin Smith

Tüm örneğin tek kullanıcı modunda başlatılması gerekir, bu nedenle çoğu durumda geçerli olmayabilir, ancak ALTER TABLE ... SWITCHbunu onsuz yapabilir.
Martin Smith

11

Bu sorunu yaşadım, ancak bir kimlik sütunu (çeşitli nedenlerle) kullanamadım. Buna karar verdim:

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

Buradan ödünç alındı .


4

Sütun tablonuzda zaten varsa ve boşsa, sütunu bu komutla güncelleyebilirsiniz (id, tablename ve tablekey yerine):

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

Bana bununla zaman kazandın! @ Gbn'nin cevabına iyi zeyilname.
Kristen Waite

2

Mevcut bir tabloya sütun eklediğimizde ve kimlik sütunu eklediğimizde, tabloyu manuel olarak doldurmaya gerek kalmadan otomatik olarak doldurulur.


2

tasarımcı tarafından kimlik (1,1) sağ tıklayabilirsiniz tbl => desing => kısmen sol (sağ tıklama) => özellikler => kimlik sütunlarında # sütun seçin

Özellikleri

kimlik sütunu


1
Bunun iyi bir yaklaşım olup olmadığı hakkında bilginiz var mı? OP bunun "devam etmenin doğru yolu" olup olmadığını soruyor. Daha eksiksiz bir cevap, yaklaşımın artılarını / eksilerini bilmelerine yardımcı olabilir.
jinglesthula

Gerçekten bu seçeneği geliştirme ortamında kullanıyorum, eğer bu değişikliği üretime geçirirseniz, kimlik alanı bazı Mağaza prosedürü tetikleyicileri tarafından kullanılıyorsa GÖRÜNÜM BAĞIMLILIĞI ile beyan etmelisiniz.
gustavo herrera

2

Tablonuzun birincil veya foriegen anahtarını kullanan diğer tablolarla ilişkisi varsa, tablonuzu değiştirmek mümkün olmayabilir. bu yüzden tabloyu tekrar bırakıp oluşturmanız gerekir.
Bu sorunları çözmek için, veritabanına sağ tıklayarak ve gelişmiş seçenek kümesi düzenine ve verilere komut dosyası veri türünü oluşturmak için Komut Dosyaları Oluşturmanız gerekir. Bundan sonra, bu komut dosyasını kullanarak sorguyu çalıştırın ve tabloyu kullanarak tabloyu tanımlayın ve yeniden oluşturun.
sorgunuz şu şekilde olacaktır:

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 

0

İşte deneyebileceğiniz bir fikir. Özgün tablo - kimlik sütunu yok table1, yeni bir tablo oluştur - kimlik sütunu ile birlikte table2 çağrısı. verileri tablo1'den tablo2'ye kopyalayın - kimlik sütunu otomatik olarak artan sayılarla otomatik olarak doldurulur.

özgün tablo - tablo1 tablo3 yeniden adlandırın yeni tablo - tablo2 tablo1 (özgün tablo) yeniden adlandırın Artık kimlik sütunu dahil ve mevcut veri için doldurulmuş table1 var. sorun olmadığından ve düzgün çalıştıktan sonra, artık gerekmediğinde table3'ü bırakın.


0

Farklı ad ve aynı sütunlar, Birincil Anahtar ve Yabancı Anahtar ilişkilendirmesi ile yeni bir Tablo oluşturun ve bunu Insert kod deyiminize bağlayın. Örneğin: ÇALIŞANLAR için ÇALIŞANLAR ile değiştirin.

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

Ancak, mevcut EMPLOYEE Tablosunu silmeniz veya gereksiniminize göre bazı ayarlamalar yapmanız gerekir.


0

Bu cevap en yüksek oyu alan cevaba küçük bir ektir ve SQL Server için çalışır. Soru bir otomatik artış birincil anahtarı istedi, mevcut yanıt birincil anahtarı ekliyor, ancak otomatik artış olarak işaretlenmiyor. Aşağıdaki komut dosyası sütunları, varlığını denetler ve otomatik bağlama bayrağı etkinken ekler.

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
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 

5
bunu açıklayabilir misin?
Muhammed Dyas Yaskur

1
Bu kod OP sorununu çözse de, kodunuzun OP sorununu nasıl ele aldığına dair bir açıklama eklemek en iyisidir. Bu şekilde, gelecekteki ziyaretçiler yayınınızdan bilgi edinebilir ve kendi kodlarına uygulayabilir. SO bir kodlama servisi değil, bilgi kaynağıdır. Ayrıca, yüksek kaliteli ve eksiksiz cevapların kaldırılması daha olasıdır. Bu özellikler, tüm yayınların bağımsız olması şartıyla birlikte, bir platform olarak SO'yu forumlardan ayıran güçlü yönlerinden bazılarıdır. Ek bilgi eklemek ve / veya açıklamalarınızı kaynak belgelerle desteklemek için düzenleyebilirsiniz.
ysf

-1

tabloyu değiştirin / ** sekmenin adını yapıştırın ** / kimlik ekle int IDENTITY (1,1)

/ ** sekmesinin adını yapıştırın ** / nereye id

(

a.id FROM / ** sekmesinin adını yapıştırın / SOL DIŞ BİRLEŞTİRME olarak yapıştırın (MIN (id) öğesini ID FROM olarak yapıştırın / sekmenin adını yapıştırın / GROUP BY / c1, c2 .... sütunlarını yapıştırın .... ** /

) as t1 
ON a.id = t1.id

T1.id NULL NEREDE

)

tabloyu değiştir / ** sekmenin adını yapıştır ** / DÜŞME KOLONU kimliği


Sorunuz nedir? Nasıl sorulur
Ann Kilzer

1
Kod örneğinizi doğru şekilde biçimlendirmek için işaretleme kullanarak yanıtınızı düzenleyin.
Bill Keller

-3

Böyle bir şey deneyin (önce bir test masasında):

Veritabanı_adınızı KULLANIN
GİT
İZLEDİĞİNİZ (SAYI SEÇİMİ (*) tablonuzdan SEÇİNİZ)
BAŞLA
    İNDİRİM SETİ 1
    Tablonuzu GÜNCELLEME your_id_field = MAX (alan_ alanınız) +1
SON
'TÜM YAPILDI' YAZDIR

Bunu hiç test etmedim, bu yüzden dikkatli ol!


1
-1 Soruyu cevaplamaz ( IDENTITYsütun ekleme ile ilgilidir ) ve yine de çalışmaz. UPDATE your_table SET your_id_field = MAX(your_id_field)+1sadece MAXoraya giremezsiniz . WHEREAynı satırı tekrar tekrar güncellemekten kaçınmak için bir madde nerede ?
Martin Smith

-3

Bu MariaDB çalışır, bu yüzden sadece SQL Server'da umuyoruz: yeni eklediğiniz kimlik sütununu bırakın, sonra aşağıdaki sözdizimini kullanın: -

ALTER TABLE tablo_adı ADD id INT PRIMARY KEY AUTO_INCREMENT;

Başka masaya gerek yok. Bu basitçe bir id sütunu ekler, onu birincil dizin yapar ve sıralı değerlerle doldurur. SQL Server bunu yapmazsa zamanımı harcadığım için özür dilerim.


-3

ALTER TABLO tablo_adı KOLON KİMLİĞİ EKLE INT NOT NULL PRIMARY KEY AUTO_INCREMENT; Bu yararlı olabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.