2012-05-23 39 views
80

Tôi có bảng hiện có mà tôi sắp thổi bay vì tôi không tạo bảng với cột ID được đặt làm cột Nhận dạng của bảng.Cách tạo bảng có cột nhận dạng

Sử dụng SQL Server Management Studio, tôi viết kịch bản một Tạo Để ... của bảng hiện có và nhận đ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à, làm thế nào tôi sẽ sửa đổi SQL này để các bảng kết quả của tôi có cột ID được đặt làm Bản sắc?

+11

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

Trả lời

114
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] 
+0

Tôi tin rằng đó là những gì tôi đang tìm kiếm. Tôi không cần phải thay đổi giá trị 'PK_History' thành' ID' hay bất cứ thứ gì? – jp2code

+0

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

+0

ý nghĩa của các tham số IDENTITY (1.1) – otc

9
[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.

enter image description here

+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ì bảng đã có. Tôi phải xóa bảng và tạo lại bảng, do đó tại sao tôi sử dụng tập lệnh. – jp2code

+4

@ jp2code: Tôi có nghĩa là bạn có thể đã tạo ra một bảng thử nghiệm với một cột Identity và sau đó kịch bản đó để xem nó nên được chỉ định như thế nào. – Phil

29

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ỉ số khó khăn 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 cho cột đó 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.

+4

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 hiện tại vật. Công cụ đó có thể không có, tùy chọn "sử dụng cú pháp đơn giản hơn nếu có thể". Ít nhất dễ bị lỗi, đối với tình hình cụ thể của OP, sẽ phải chỉnh sửa một dòng trong DDL được tạo ra, 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 một tên cho ràng buộc PK như OP có.Nhiều người thích ràng buộc của tôi được đặt tên để họ có cùng tên trong tất cả các môi trường (dev, test, prod). 'ID int ràng buộc PK_History khóa chính bản sắc (1,1)' Tôi tin. –

+3

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

-2

Phím 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ùng giá trị như sau:

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ẽ nhận được thông báo lỗi như:

Vi phạm chế KEY UNIQUE 'UQ__teppp__72E12F1B2E1BDC42'. Không thể chèn khóa trùng lặp trong đối tượng 'dbo.teppp'.
Tuyên bố đã bị chấm dứt.

+0

Tôi cần làm cột 'ID' ** duy nhất **, không phải cột' Tên'. Tại sao bạn thêm giới hạn ** duy nhất ** vào cột 'Tên'? Làm thế nào mà có lợi cho bạn trong bảng 'teppp' của bạn? – jp2code

+0

Không phải tất cả câu trả lời cho câu hỏi ở đây –

Các vấn đề liên quan