Cách tạo bảng với cột nhận dạng


111

Tôi có một bảng hiện có mà tôi sắp sửa xóa đi vì tôi không tạo nó với IDcột được đặt là cột Danh tính của bảng.

Sử dụng SQL Server Management Studio , tôi đã viết tập lệnh "Tạo Tới ..." của bảng hiện có và nhận được điều này:

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]

Câu hỏi của tôi là, tôi sẽ sửa đổi điều này SQLnhư thế nào để bảng kết quả của tôi có IDcột được đặt làm Danh tính ?


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

Câu trả lời:


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
Tôi tin rằng đó là những gì tôi đang tìm kiếm. Tôi không cần thay đổi PK_Historygiá trị thành IDhay bất cứ điều gì?
jp2code

Không, đó là tất cả những gì bạn cần, PK_History chỉ là tên của ràng buộc mà ràng buộc khóa chính đã có trên ID cột rồi
Gratzy

1
ý nghĩa của các tham số IDENTITY (1,1)
otc

4
Identity (hạt giống, số gia tăng) docs.microsoft.com/en-us/sql/t-sql/statements/…
Gratzy, 31/07/17

33

Điều này đã được trả lời, nhưng tôi nghĩ rằng cú pháp đơn giản nhất là:

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

Chỉ mục ràng buộc phức tạp hơn rất hữu ích khi bạn thực sự muốn thay đổi các tùy chọn.

Nhân tiện, tôi thích đặt tên cột như vậy là HistoryId, vì vậy nó khớp với tên của các cột trong mối quan hệ khóa ngoại.


5
OP đang làm việc cụ thể với đầu ra của một công cụ GUI xuất ra DDL cho một đối tượng hiện có. Công cụ đó có lẽ không có, tùy chọn "sử dụng cú pháp đơn giản hơn nếu có thể". Ít xảy ra lỗi nhất, đối với tình huống cụ thể của OP, sẽ là chỉnh sửa một dòng trong DDL đã tạo, và không cố gắng viết nó từ đầu bằng cú pháp đơn giản nhất. Ngoài ra, ví dụ bạn đưa ra không gán tên cho ràng buộc PK như OP đã có. Nhiều người thích các ràng buộc của tôi được đặt tên để chúng có cùng tên trong tất cả các môi trường (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Tôi tin.
Shannon thôi việc vào

3
Co le không. Tôi đã gặp phải tình huống lấy tập lệnh từ một cơ sở dữ liệu, sử dụng nó trên một máy chủ khác và các giá trị mặc định hoạt động ở một nơi không tốt nhất cho nơi khác. Trong mọi trường hợp, tôi chỉ đề xuất đây là một giải pháp vì nó có vẻ đơn giản hơn đối với tôi (Cá nhân tôi hiểu từ khóa "khóa chính" tốt hơn nhiều so với việc tôi hiểu các tùy chọn trên một ràng buộc và tôi coi việc sử dụng các tùy chọn mà tôi không hiểu là "tệ "). Tuy nhiên, bạn nói rõ lý do tại sao giải pháp khác có thể được ưu tiên hơn. Tôi nên nói thêm, câu trả lời đó đã là câu trả lời được chấp nhận.
Gordon Linoff

@GordonLinoff: Mate, khóa chính theo mặc định không phải là null, tại sao bạn cần chỉ định rõ ràng không phải null ở đây?
Người học

@ Người học. . . Cả hai ràng buộc đều nằm trong mã của OP. Là NOT NULLthừa.
Gordon Linoff

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

tất nhiên vì bạn đang tạo bảng trong SQL Server Management Studio, bạn có thể sử dụng trình thiết kế bảng để đặt Đặc điểm nhận dạng.

nhập mô tả hình ảnh ở đây


1
Vâng, cảm ơn Phil. Tôi biết làm thế nào để làm điều đó, nhưng tôi không thể vì cái bàn đã có sẵn. Tôi phải xóa bảng và tạo lại nó, đó là lý do tại sao tôi sử dụng tập lệnh.
jp2code

4
@ jp2code: Ý tôi là bạn có thể tạo một bảng thử nghiệm với cột Identity và sau đó viết script đó để xem nó nên được chỉ định như thế nào.
Phil

-2

Khóa duy nhất cho phép tối đa 2 giá trị NULL. Giải thích:

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

Nếu bạn thử chèn các giá trị giống như bên dưới:

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

Mỗi lần bạn sẽ gặp lỗi như:

Vi phạm ràng buộc KHÓA DUY NHẤT 'UQ__teppp__72E12F1B2E1BDC42'. Không thể chèn khóa trùng lặp vào đối tượng 'dbo.teppp'.
Các tuyên bố này đã bị chấm dứt.


Tôi cần tạo IDcột duy nhất , không phải Namecột. Tại sao bạn lại thêm ràng buộc duy nhất vào Namecột? Làm thế nào điều đó có lợi cho bạn trong tepppbảng của bạn ?
jp2code

1
Không phải là câu trả lời cho câu hỏi ở đây
Martin Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.