Cara Membuat Tabel dengan Kolom Identitas

111

Saya memiliki tabel yang sudah ada yang akan saya hancurkan karena saya tidak membuatnya dengan IDkumpulan kolom menjadi kolom Identitas tabel.

Dengan menggunakan SQL Server Management Studio , saya membuat skrip "Buat Ke ..." dari tabel yang ada dan mendapatkan ini:

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]

Pertanyaan saya adalah, bagaimana saya memodifikasi ini SQLsehingga tabel yang saya hasilkan memiliki IDkolom yang ditetapkan sebagai Identitas ?

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

Jawaban:

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]
Gratzy
sumber
1
Saya yakin itulah yang saya cari. Saya tidak perlu mengubah PK_Historynilainya menjadi IDatau apa pun?
jp2code
Tidak, itu yang harus Anda butuhkan, PK_History hanyalah nama batasan batasan kunci utama sudah ada di kolom ID
Gratzy
1
apa arti dari parameter IDENTITAS (1,1)
otc
4
Identitas (seed, increment) docs.microsoft.com/en-us/sql/t-sql/statements/…
Gratzy
33

Ini sudah dijawab, tapi menurut saya sintaks yang paling sederhana adalah:

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

Indeks kendala yang lebih rumit berguna saat Anda benar-benar ingin mengubah opsi.

Ngomong-ngomong, saya lebih suka memberi nama kolom seperti HistoryId, sehingga cocok dengan nama kolom dalam hubungan kunci asing.

Gordon Linoff
sumber
5
OP secara khusus bekerja dengan keluaran alat GUI yang mengeluarkan DDL untuk objek yang ada. Alat itu mungkin tidak memiliki, opsi "gunakan sintaks yang lebih sederhana jika memungkinkan". Rawan kesalahan terkecil, untuk situasi spesifik OP, akan mengedit satu baris di DDL yang dihasilkan, dan tidak mencoba menulisnya dari awal menggunakan sintaks yang paling sederhana. Juga contoh yang Anda berikan tidak memberikan nama ke batasan PK seperti yang dimiliki OP. Banyak yang lebih suka batasan saya dinamai sehingga mereka memiliki nama yang sama di semua lingkungan (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Aku percaya.
Shannon Severance
3
Mungkin tidak. Saya pernah berada dalam situasi di mana saya mengambil skrip dari satu database, menggunakannya di server lain, dan default yang berfungsi di satu tempat tidak terbaik untuk yang lain. Bagaimanapun, saya hanya menyarankan ini sebagai solusi karena tampaknya lebih sederhana bagi saya (saya pribadi memahami kata kunci "kunci utama" jauh lebih baik daripada saya memahami opsi tentang kendala dan saya mempertimbangkan untuk menggunakan opsi yang tidak saya mengerti sebagai "buruk "). Namun, Anda membuat poin bagus tentang mengapa solusi lain mungkin lebih disukai. Saya harus menambahkan, jawaban itu sudah merupakan jawaban yang diterima.
Gordon Linoff
@GordonLinoff: Mate, kunci utama secara default bukan null, mengapa Anda perlu secara eksplisit menentukan bukan null di sini?
Pelajar
@Pelajar. . . Kedua kendala itu ada di kode OP. Itu NOT NULLberlebihan.
Gordon Linoff
12
[id] [int] IDENTITY(1,1) NOT NULL,

tentu saja karena Anda membuat tabel di SQL Server Management Studio, Anda dapat menggunakan desainer tabel untuk menetapkan Spesifikasi Identitas.

masukkan deskripsi gambar di sini

Phil
sumber
1
Terima kasih Phil. Saya tahu bagaimana melakukan itu, tetapi saya tidak bisa karena mejanya sudah ada. Saya harus menghapus tabel dan membuatnya kembali, oleh karena itu saya menggunakan skrip.
jp2code
4
@ jp2code: Maksud saya, Anda dapat membuat tabel uji dengan kolom Identitas dan kemudian membuat skrip untuk melihat bagaimana itu harus ditentukan.
Phil
-2

Kunci unik memungkinkan maks 2 nilai NULL. Penjelasan:

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

Jika Anda mencoba memasukkan nilai yang sama seperti di bawah ini:

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

Setiap kali Anda akan mendapatkan kesalahan seperti:

Pelanggaran kendala UNIQUE KEY 'UQ__teppp__72E12F1B2E1BDC42'. Tidak dapat memasukkan kunci duplikat dalam objek 'dbo.teppp'.
Pernyataan tersebut telah dihentikan.

Priyanka
sumber
Saya perlu membuat IDkolom unik , bukan Namekolomnya. Mengapa Anda menambahkan batasan unik ke Namekolom? Apa manfaatnya bagi Anda di tepppmeja Anda ?
jp2code
1
Sama sekali bukan jawaban untuk Q di sini
Martin Smith