SQL Server Management Studio 2012'de otomatik artan birincil anahtar


447

Nasıl yaparım bir de veritabanı tablosu, forumdaki bir göz yaşadım ama nasıl göremez.auto incrementprimary keySQL Server

Özelliklerine baktım ama bir seçenek göremiyorum, Identityşartname özelliğine gidip evet olarak ayarlayıp Identity increment1 olarak ayarladığınız bir cevap gördüm , ancak bu bölüm gri ve değiştiremiyorum evet hayır.

Bunu yapmanın basit bir yolu olmalı ama bulamıyorum.


5
Anahtar sütununun veri türü int mi?
Raab

1
@CoDe aDŞu anını char (10) olarak ayarladı ama sadece pratik yaptığım gibi değiştirebilirim, teşekkürler
Ledgemonkey

Yanıtlar:


704

Anahtar sütununun veri türünün olduğundan emin olun intve ardından resimde gösterildiği gibi kimliği manuel olarak ayarlayın

resim açıklamasını buraya girin

Veya sadece bu kodu çalıştırın

-- ID is the name of the  [to be] identity column
ALTER TABLE [yourTable] DROP COLUMN ID 
ALTER TABLE [yourTable] ADD ID INT IDENTITY(1,1)

IDtablodaki tek sütun değilse kod çalışır

görüntü referansı fifo


21
Düzeltme Sadece biraz: IDENTITY(olması gerektiği, böylece mülkiyet herhangi bir sayısal veri türlerine uygulanabilir tinyint, smallint, int, bigint, numeric, decimal), tek kısıt o yüzden (fraksiyonel sayısını temsil edemeyeceğini olduğunu olamaz float ya real, ne numericya decimal sıfır olmayan ölçek ) ve ofc ile kimlik spesifikasyonu seçilen veri türüyle uyumlu olmalıdır.
Pred

2
Yabancı anahtar vb.
Andrew Day

3
Eklemek istedim, zaten kimlik sütununuzda zaten varsayılan bir değer belirlediyseniz, (Kimlik mi) gri renkte kalır. Varsayılan değeri kaldırın, tekrar kullanılabilir hale gelir.
CDspace

7
Değerleri değiştiremiyorsanız, Araçlar-Seçenekler-Tasarımcılar'a gidin ve "Yeniden oluşturma gerektiren değişiklikleri kaydetmeyi önle" seçeneğinin işaretini kaldırın.
Jaume

185

Tabloyu oluştururken IDENTITYaşağıdaki gibi bir sütun oluşturabilirsiniz :

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

IDENTITYVarolan bir sütuna bu eklemek istiyorsanız mülkiyet irade otomatik artış 1 numaralı sütun yukarı (sütunun veri türü bir tamsayı olması gerektiğini Not.), Bir kullanma ALTER TABLEkomutu.

Düzenleme:
Biraz sınadım ve çeşitli tablolar için Sütun Özellikleri penceresinden Kimlik özelliklerini değiştirmenin bir yolunu bulamıyorum. Bir sütunu bir kimlik sütunu yapmak istiyorsanız, bir ALTER TABLEkomut kullanmalısınız .


Ah, bu özellikle SQL Server 2008 r2 için - boş verin.
Josien

2
Bu tablo sözdizimi oluşturmak iyi yorum bu yazının yazar tarafından tavsiye edildiği gibi yorum, umut birine yardımcı olur.
shaijut

88

Artışı ve çekirdeği açığa çıkarmak için Kimlik bölümünü genişletmelisiniz.

resim açıklamasını buraya girin

Düzenleme: char (10) değil, bir tamsayı veri türüne sahip olduğunuzu varsaydım. Bu cevabı gönderdiğimde söyleyeceğim ve geçerli olan makul


2
yesOlduğu gibi soluk gri renkte char(10)(yorum sadece yayınlanmıştır)
Martin Smith

@Martin Smith evet genel sorun gibi görünüyor, bunu değiştireceğim ve test edeceğim, çok teşekkürler
Ledgemonkey

Yeni bir tablo oluştururken BookID int primary key identityhem tohum hem de artış belirtmedim, bu iyi bir uygulama mı? neden i MSDN'de belgelere bakın Hiçbiri belirtilmezse, varsayılan (1,1) 'dir.
shaijut

40

Veritabanınızı genişletin, tablonuzu genişletin, tablonuza sağ tıklayın ve açılır menüden tasarım seçin. IT böyle görünüyor

Şimdi aşağıdaki Sütun özellikleri aşağı kaydırın ve Kimlik Spesifikasyonu'nu bulun , genişletin ve Kimliğin Evet olmasını sağladığını göreceksiniz . Şimdi, altında artırmak istediğiniz değeri vermek için hemen altındaki Kimlik Artışı'nı seçin . resim açıklamasını buraya girin


1
Bu bana doğru cevap gibi görünüyor, sadece veri türünü bir int yapmak hile olmaz, değil mi?
Drewdin

10

Belki bir şey eksik ama neden SEQUENCE nesnesi ile çalışmıyor? Aradığınız kişi bu değil mi?

Misal:

CREATE SCHEMA blah.
GO

CREATE SEQUENCE blah.blahsequence
START WITH 1
INCREMENT BY 1
NO CYCLE;

CREATE TABLE blah.de_blah_blah
(numbers bigint PRIMARY KEY NOT NULL
......etc

Bir INSERT komutunun söz konusu ciddiyetine başvururken şunları kullanın:

NEXT VALUE FOR blah.blahsequence

SEQUENCE için daha fazla bilgi ve seçenekler


Bu çözüm, eklenen satırların zaman sırasına önem veriyorsanız doğru çözümdür, çünkü IDENTITYbazen boşlukları bırakarak atlar ve bu boşlukları tekrar doldurmak için geri döner. Yani IDENTITYher zaman incrmenet koşulu garanti etmez
FindOut_Quran

1
@Martin Smith Oops, bağlantıyı takip etmedi, hatam! MS-SQL için bazı özelliklere sahip olmadığım için bazen daha fazla şeyi destekleyen yeni sürümler olduğunu unuttum. Kafa karıştırıcı olabileceğinden yorumumu sileceğim ... Daha genel ifade edilirse yine de geçerli kalır: SEQUENCE nesnelerini desteklemeyen bir RDBMS marka / sürümü kullanıyor olabilir - özellikle de soru yalnızca SQL Server 2012'nin yayınlanmasından birkaç ay sonra;)
Paul Groke

1
@FindOut_Quran IDENTITY sütunlarındaki boşlukların doldurulduğundan emin misiniz? Ben sadece bunu hiç görmedim SQL Server 2005 ile çalıştım - boşluklar sadece kalır. Ve herhangi bir RDBMS üzerinde olduğunu görmek oldukça şaşırırdım çünkü böyle bir özellik garip bir "özgür değil" (performans açısından) ve "arzu edilmez" (en azından çoğu uygulamada) olacak.
Paul Groke

@PaulGroke Evet, eminim. 1000 satır eklemek ve ardından geri almak için bir işlem kullanmayı deneyebilirsiniz. Kimlik değeri atlayacak. Binlerce satır eklemeyi ve / / geri almayı deneyin. Bazen boşlukları doldurmanın geri
döndüğünü

@FindOut_Quran Bunun nasıl olabileceğini göremiyorum. MS SQL KİMLİĞİ sütunları, kullanıcı tarafından tanımlanabilir bir değerde ekilen ve daha sonra kullanıcı tarafından tanımlanabilir bir değerle artırılan basit bir sayaç kullanır. Sayacı sorgulayabilir ve yeniden ayarlayabilirsiniz. Bunun olduğunu görebilmemin tek yolu, eşzamanlı işlemlerin "bozuk" olduğu zamandır. Yani, KİMLİK sayacını ilk önce çarpan işlem başka bir işlemden sonra gerçekleşir. Bu durumda kısa süreli bir boşluğunuz olur ve bu da doldurulur. Hangi çarpışmaları önlemek için gereklidir. KİMLİK sayacı asla geri atlamayacak.
Paul Groke

7

Veri Türü: int kullanırken, otomatik büyütme almak istediğiniz satırı seçebilir ve sütun özellikleri etiketine gidebilirsiniz. Burada kimliği 'evet' olarak ayarlayabilirsiniz. Otomatik eklemenin başlangıç ​​değeri de burada düzenlenebilir. Umarım yardımcı olabilirim;)


sütun özellikleri nerede bulunur?

2

Ben zaten tablo oluşturmuştu ve bu yüzden ne yaptım böylece tablo bırakarak değiştiremedi bu sorunu vardı : (Ne zaman onlar bunu uyguladığından emin değilim ama SQL 2016 vardı)

Nesne Gezgini'nde tabloya sağ tıklayın:

Script Table as > DROP And CREATE To > New Query Editor Window

Sonra Josien tarafından söylenen senaryoda düzenleme yapmak; olduğu yere gidin, CREATE TABLEBirincil Anahtarınızı bulun IDENTITY(1,1)ve virgülden önce sonuna ekleyin . Komut dosyasını çalıştırın.

DROP ve CREATE betiği de bu sorundan dolayı bana yardımcı oldu . (Oluşturulan komut dosyasının işlediği.)


1

Kimlik öğelerinin birbirine yakın olmasını isteyip istemediğinize dikkat edin. SQLSERVER ID 1000 kadar atlayabilir.

İncele: yeniden başlatmadan önce ID = 11, yeniden başlattıktan sonra tabloya yeni bir satır eklersiniz, sonra id 1012 olur.


1

Anahtar kelimeyi , tabloyu oluştururken kısıtlamayla IDENTITYbirlikte sütuna veri türü olarak kullanabilirsiniz PRIMARY KEY.
örn:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Burada ilk '1' başlangıç ​​değeri, ikinci '1' ise artan değerdir.


1
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

MS SQL Server, otomatik artış özelliğini gerçekleştirmek için IDENTITY anahtar sözcüğünü kullanır.

Yukarıdaki örnekte, KİMLİK için başlangıç ​​değeri 1'dir ve her yeni kayıt için 1 artar.

İpucu: "Personid" sütununun 10 değerinden başlayıp 5 oranında artırılması gerektiğini belirtmek için, IDENTITY (10,5) olarak değiştirin.

"Kişiler" tablosuna yeni bir kayıt eklemek için "Personid" sütunu için bir değer belirtmemiz gerekmeyecektir (benzersiz bir değer otomatik olarak eklenecektir):


0

Tablo zaten doldurulmuşsa, bir sütunu KİMLİK sütununa değiştirmek veya KİMLİK olmayan sütuna dönüştürmek mümkün değildir. Tüm verileri dışarı aktarmanız, ardından sütun türünü KİMLİK olarak değiştirebilir veya tam tersini yapabilir ve ardından verileri geri alabilirsiniz. Acı verici bir süreç olduğunu biliyorum ama bu yazıda bahsedildiği gibi sekans kullanmak dışında bir alternatif olmadığına inanıyorum.


1
ALTER TABLE ... SWITCHVerilere hiç dokunmak zorunda kalmadan meta verileri değiştirmek için kullanabilirsiniz . Örneğin, veri kaybı olmadan tablo oluşturduktan sonra otomatik artışın nasıl ayarlanacağını görüyor musunuz?
Martin Smith

1
Sağladığınız bağlantıda belirtilen işlem, verilerin yukarıdaki tabloya uygun olan geçici tabloya ve arkaya aktarılmasını içerir. Eğer yanılıyorsam lütfen bana örnek verin.
Softec

1
Bağlantıda çalışan bir örnek var. "Verileri geçici tabloya ve arkaya aktarma" diye bir şey yoktur. `ALTER TABLE ... SWITCH` yalnızca meta veri değişikliğidir. Hiçbir veri taşımaz.
Martin Smith
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.