Kimlik Sütunu ile Tablo Nasıl Oluşturulur


111

IDTablonun Kimlik sütunu olacak şekilde sütun setiyle oluşturmadığım için patlatmak üzere olduğum mevcut bir tablom var .

SQL Server Management Studio'yu kullanarak mevcut tablonun bir "Create To ..." komut dosyası oluşturdum ve şunu aldım:

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Sorum şu, bunu nasıl değiştirebilirim SQLki ortaya çıkan tablomda IDsütun Kimlik olarak ayarlanmış olsun ?


11
[ID] [int] NOT NULL IDENTITY (1,1)
Li0liQ

Yanıtlar:


153
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
) ON [PRIMARY]

1
Sanırım aradığım şey bu. PK_HistoryDeğeri IDveya herhangi bir şeyi değiştirmeme gerek yok mu?
jp2code

Hayır, ihtiyacınız olan tek şey bu olmalı, PK_History sadece kısıtlamanın adıdır, birincil anahtar kısıtlaması zaten sütun kimliğindedir
Gratzy

1
IDENTITY (1,1) parametrelerinin anlamı nedir
otc


33

Bu zaten yanıtlandı, ancak bence en basit sözdizimi:

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL,
    . . .

Daha karmaşık kısıtlama indeksi, seçenekleri gerçekten değiştirmek istediğinizde kullanışlıdır.

Bu arada, böyle bir sütunu HistoryId olarak adlandırmayı tercih ediyorum, bu yüzden yabancı anahtar ilişkilerinde sütunların adlarıyla eşleşiyor.


5
OP, özellikle mevcut bir nesne için DDL çıkaran bir GUI aracının çıktısıyla çalışıyor. Bu araç muhtemelen "mümkünse daha basit sözdizimi kullan" seçeneğine sahip değildir. OP'nin özel durumu için en az hata eğilimi, oluşturulan DDL'deki bir satırı düzenlemek ve onu en basit sözdizimini kullanarak sıfırdan yazmaya çalışmak olacaktır. Ayrıca verdiğiniz örnek, OP'nin sahip olduğu PK kısıtlamasına bir isim vermez. Birçoğu, tüm ortamlarda (dev, test, prod) aynı ada sahip olmaları için adlandırılmış kısıtlamalarımı tercih eder. ID int constraint PK_History primary key identity(1,1)İnanıyorum.
Shannon Kıdem Tazminatı

3
Belki, belki değil. Komut dosyasını bir veritabanından aldığım, başka bir sunucuda kullandığım ve bir yerde çalışan varsayılanların diğeri için en iyi olmadığı durumlarda bulundum. Her halükarda, bana daha basit göründüğü için bunu yalnızca bir çözüm olarak önerdim (kişisel olarak "birincil anahtar" anahtar kelimesini, bir kısıtlamadaki seçenekleri anladığımdan çok daha iyi anlıyorum ve anlamadığım seçenekleri kullanmayı "kötü "). Ancak, başka bir çözümün neden tercih edilebileceği konusunda iyi bir noktaya değindiniz. Eklemeliyim ki, bu cevap zaten kabul edilmiş cevaptır.
Gordon Linoff

@GordonLinoff: Mate, birincil anahtar varsayılan olarak boş değil, neden burada açıkça null olmadığını belirtmeniz gerekiyor?
Öğrenci

@ Öğrenen. . . Her iki kısıtlama da OP'nin kodundaydı. NOT NULLGereksiz olduğunu.
Gordon Linoff

12
[id] [int] IDENTITY(1,1) NOT NULL,

tabloyu SQL Server Management Studio'da oluşturduğunuz için, elbette Kimlik Spesifikasyonunu ayarlamak için tablo tasarımcısını kullanabilirsiniz.

görüntü açıklamasını buraya girin


1
Teşekkürler Phil. Bunu nasıl yapacağımı biliyorum ama yapamıyorum çünkü masa zaten orada. Tabloyu silmem ve yeniden oluşturmam gerekiyor, bu yüzden betiği kullanıyorum.
jp2code

4
@ jp2code: Bir Kimlik sütunuyla bir test tablosu oluşturabileceğinizi ve ardından nasıl belirtilmesi gerektiğini görmek için bunu komut dosyası olarak yazabileceğinizi kastettim.
Phil

-2

Benzersiz anahtar, maksimum 2 NULL değere izin verir. Açıklama:

create table teppp
(
id int identity(1,1) primary key,
name varchar(10 )unique,
addresss varchar(10)
)

insert into teppp ( name,addresss) values ('','address1')
insert into teppp ( name,addresss) values ('NULL','address2')
insert into teppp ( addresss) values ('address3')

select * from teppp
null string , address1
NULL,address2
NULL,address3

Aşağıdaki ile aynı değerleri eklemeyi denerseniz:

insert into teppp ( name,addresss) values ('','address4')
insert into teppp ( name,addresss) values ('NULL','address5')
insert into teppp ( addresss) values ('address6')

Her seferinde aşağıdaki gibi bir hata alacaksınız:

UNIQUE KEY kısıtlaması 'UQ__teppp__72E12F1B2E1BDC42' ihlali. Yinelenen anahtar 'dbo.teppp' nesnesine eklenemez.
Açıklama sona erdirildi.


IDSütunu değil, sütunu benzersiz yapmam gerekiyordu Name. Neden benzersiz kısıtlamayı Namesütuna eklediniz ? Masanızda bu size nasıl fayda sağlar teppp?
jp2code

1
Buradaki soruya hiç bir cevap değil
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.