Khóa chính tăng tự động trong SQL Server Management Studio 2012


446

Làm thế nào để auto incrementcác primary keytrong một SQL Serverbảng cơ sở dữ liệu, tôi đã có một cái nhìn thông qua diễn đàn nhưng không thể nhìn thấy như thế nào.

Tôi đã xem các thuộc tính nhưng không thể thấy tùy chọn, tôi đã thấy câu trả lời khi bạn đi đến thuộc Identitytính đặc tả và đặt thành có và đặt thành Identity increment1, nhưng phần đó có màu xám và tôi không thể thay đổi không có

Phải có một cách đơn giản để làm điều này nhưng tôi không thể tìm thấy nó.


5
Là kiểu dữ liệu của cột chính là int?
Raab

1
@CoDe aDDict hiện tại của nó được đặt là char (10) nhưng tôi có thể thay đổi nó khi tôi chỉ đang thực hành, cảm ơn
Ledgemonkey

Câu trả lời:


703

Đảm bảo rằng kiểu dữ liệu của cột Key intvà sau đó đặt nhận dạng theo cách thủ công, như hình ảnh hiển thị

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

Hoặc chỉ chạy mã này

-- 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)

mã sẽ chạy, nếu IDkhông phải là cột duy nhất trong bảng

hình ảnh tham khảo fifo


21
Chỉ cần một chút điều chỉnh: Các IDENTITYtài sản có thể được áp dụng cho bất kỳ loại dữ liệu số (vì vậy nó có thể được tinyint, smallint, int, bigint, numeric, decimal), hạn chế duy nhất là nó không thể đại diện cho số phân đoạn (vì vậy nó không thể float hay real, không numerichay decimal với tỷ lệ khác không ) và ofc, thông số nhận dạng phải tương thích với kiểu dữ liệu đã chọn.
Pred

2
Làm việc, cung cấp không có khóa ngoại, v.v.
Ngày Andrew

3
Tôi chỉ muốn thêm, nếu bạn đã đặt giá trị mặc định trên cột danh tính của mình, (Danh tính) vẫn bị mờ đi. Xóa giá trị mặc định và nó sẽ có sẵn một lần nữa.
CDspace

7
Nếu bạn không thể sửa đổi các giá trị, hãy đi tới Công cụ-Tùy chọn-Nhà thiết kế và bỏ chọn tùy chọn "ngăn lưu các thay đổi yêu cầu tạo lại".
Jaume

184

Khi bạn đang tạo bảng, bạn có thể tạo một IDENTITYcột như sau:

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

Các IDENTITYbất động sản sẽ tự động tăng lên cột từ số 1. (Lưu ý rằng kiểu dữ liệu của cột phải là một số nguyên.) Nếu bạn muốn thêm video này vào một cột hiện có, sử dụng một ALTER TABLElệnh.

Chỉnh sửa:
Đã kiểm tra một chút và tôi không thể tìm cách thay đổi thuộc tính Danh tính thông qua cửa sổ Thuộc tính Cột cho các bảng khác nhau. Tôi đoán nếu bạn muốn biến một cột thành một cột định danh, bạn phải sử dụng một ALTER TABLElệnh.


À, cái này dành riêng cho SQL Server 2008 r2 - đừng bận tâm.
Josien

2
cú pháp tạo bảng này là thực hành tốt theo lời khuyên của tác giả bài viết này trong các bình luận, hy vọng sẽ giúp được ai đó.
shaijut

88

Bạn phải mở rộng phần Danh tính để hiển thị mức tăng và hạt giống.

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

Chỉnh sửa: Tôi giả sử rằng bạn có một kiểu dữ liệu số nguyên, không phải char (10). Điều này hợp lý tôi sẽ nói và hợp lệ khi tôi đăng câu trả lời này


2
yescó màu xám như vậy char(10)(từ bình luận vừa được đăng)
Martin Smith

@Martin Smith vâng, đó dường như là vấn đề chung, tôi sẽ thay đổi điều này và thử nghiệm, cảm ơn rất nhiều
Ledgemonkey

Trong khi tạo một bảng mới tôi đã sử dụng, BookID int primary key identitytôi không chỉ định cả hạt giống và số gia, đó có phải là cách thực hành tốt không? vì tôi thấy tài liệu trong MSDN Nếu không được chỉ định, mặc định là (1,1).
shaijut

40

Mở rộng cơ sở dữ liệu của bạn, mở rộng bảng của bạn nhấp chuột phải vào bảng của bạn và chọn thiết kế từ danh sách thả xuống. Trông như thế này

Bây giờ, đi đến các thuộc tính Cột bên dưới của nó cuộn xuống và tìm Thông số nhận dạng , mở rộng nó và bạn sẽ thấy Is Identity làm cho nó Có. Bây giờ, chọn Nhận dạng tăng ngay bên dưới của nó, đưa ra giá trị bạn muốn tăng trong đó. nhập mô tả hình ảnh ở đây


1
Có vẻ như đây sẽ là câu trả lời chính xác cho tôi, chỉ cần làm cho kiểu dữ liệu trở thành một trò lừa bịp, phải không?
Drewdin

10

Có lẽ tôi đang thiếu một cái gì đó nhưng tại sao điều này không hoạt động với đối tượng SEQUENCE? Đây không phải là những gì bạn đang tìm kiếm?

Thí dụ:

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

Khi tham chiếu bình phương, nói lệnh INSERT chỉ cần sử dụng:

NEXT VALUE FOR blah.blahsequence

Thêm thông tin và lựa chọn cho SEQUENCE


Giải pháp này là giải pháp chính xác nếu bạn quan tâm đến thứ tự thời gian của các hàng được chèn, bởi vì IDENTITYđôi khi nhảy để lại những khoảng trống thì nó lại quay trở lại để lấp đầy những khoảng trống đó một lần nữa. Vì vậy, IDENTITYkhông đảm bảo điều kiện gia tăng LUÔN LUÔN
FindOut_Quran

1
@Martin Smith Rất tiếc, đã không theo liên kết, lỗi của tôi! Tôi đã quá quen với MS-SQL khi không có một số tính năng nhất định mà đôi khi tôi quên rằng có những phiên bản mới hơn hỗ trợ nhiều thứ hơn. Tôi sẽ xóa nhận xét của mình vì nó có thể gây nhầm lẫn ... Nếu nói chung chung thì nó vẫn hợp lệ: có thể là anh ta đang sử dụng một phiên bản / phiên bản RDBMS không hỗ trợ các đối tượng SEQUENCE - đặc biệt là vì câu hỏi chỉ được hỏi Vài tháng sau khi SQL Server 2012 được phát hành;)
Paul Groke

1
@FindOut_Quran Bạn có chắc rằng các khoảng trống trong các cột IDENTITY đã được lấp đầy? Tôi chỉ làm việc với SQL Server 2005 mà tôi chưa bao giờ thấy điều đó xảy ra - các lỗ hổng đơn giản vẫn còn. Và tôi khá ngạc nhiên khi thấy nó xảy ra trên bất kỳ RDBMS nào vì tính năng như vậy sẽ là sự kết hợp kỳ lạ giữa "không miễn phí" (hiệu năng thông minh) và "không mong muốn" (ít nhất là trong hầu hết các ứng dụng).
Paul Groke

@PaulGroke Vâng, tôi chắc chắn. Bạn có thể thử sử dụng một giao dịch để chèn 1000 hàng, sau đó khôi phục. Giá trị idenetity sẽ tăng lên. Cố gắng chèn thêm hàng ngàn hàng và cam kết / hoặc rollback. Đôi khi bạn sẽ thấy nó quay lại để lấp đầy các khoảng trống
FindOut_Quran

@FindOut_Quran Tôi không thể thấy điều này có thể xảy ra. Các cột ID SQL IDENTITY sử dụng một bộ đếm đơn giản được gieo vào giá trị có thể xác định được của người dùng và sau đó được tăng lên bởi một giá trị có thể xác định được bởi người dùng. Bạn thậm chí có thể truy vấn và đặt lại bộ đếm. Cách duy nhất tôi có thể thấy điều này xảy ra là khi các giao dịch đồng thời cam kết "không theo thứ tự". Tức là giao dịch lần đầu tiên bị phá vỡ bộ đếm IDENTITY cam kết sau một giao dịch khác. Trong trường hợp đó, bạn có một khoảng cách ngắn và sau đó được lấp đầy. Đó là cần thiết để tránh va chạm. Bộ đếm IDENTITY sẽ không bao giờ nhảy trở lại mặc dù.
Paul Groke 30/03/2017

7

Khi bạn đang sử dụng Kiểu dữ liệu: int, bạn có thể chọn hàng mà bạn muốn nhận tự động và đi đến thẻ thuộc tính cột. Ở đó bạn có thể đặt danh tính thành 'có'. Giá trị bắt đầu cho tự động cũng có thể được chỉnh sửa ở đó. Hy vọng tôi có thể giúp đỡ;)


các thuộc tính cột nằm ở đâu?

2

Tôi gặp vấn đề này khi tôi đã tạo bảng và không thể thay đổi bảng mà không bỏ bảng vì vậy những gì tôi đã làm là: (Không chắc chắn khi họ thực hiện điều này nhưng đã có nó trong SQL 2016)

Nhấp chuột phải vào bảng trong Object Explorer:

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

Sau đó thực hiện chỉnh sửa kịch bản do Josien nói; cuộn xuống phía dưới nơi CREATE TABLEcó, tìm Khóa chính của bạn và nối IDENTITY(1,1)đến cuối trước dấu phẩy. Chạy script.

Kịch bản DROP và CREATE cũng hữu ích cho tôi vì vấn đề này. (Mà tập lệnh được tạo xử lý.)


1

Hãy cẩn thận như nếu bạn muốn các yếu tố ID có liên quan hay không. Vì ID SQLSERVER có thể tăng 1000.

Kiểm tra: trước khi khởi động lại ID = 11 sau khi khởi động lại, bạn chèn hàng mới vào bảng, sau đó id sẽ là 1012.


1

Bạn có thể sử dụng từ khóa IDENTITYlàm kiểu dữ liệu cho cột cùng với PRIMARY KEYràng buộc khi tạo bảng.
Ví dụ:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Ở đây, '1' đầu tiên có nghĩa là giá trị bắt đầu và '1' thứ hai là giá trị tăng dần.


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

MS SQL Server sử dụng từ khóa IDENTITY để thực hiện tính năng tự động tăng.

Trong ví dụ trên, giá trị bắt đầu cho IDENTITY là 1 và nó sẽ tăng thêm 1 cho mỗi bản ghi mới.

Mẹo: Để chỉ định rằng cột "Personid" phải bắt đầu ở giá trị 10 và tăng thêm 5, hãy đổi nó thành IDENTITY (10,5).

Để chèn một bản ghi mới vào bảng "Người", chúng tôi sẽ KHÔNG phải chỉ định một giá trị cho cột "Personid" (một giá trị duy nhất sẽ được thêm tự động):


0

Nếu bảng đã được điền, không thể thay đổi cột thành cột IDENTITY hoặc chuyển đổi nó thành cột không IDENTITY. Bạn sẽ cần xuất tất cả dữ liệu ra sau đó bạn có thể thay đổi loại cột thành IDENTITY hoặc ngược lại và sau đó nhập dữ liệu trở lại. Tôi biết đó là một quá trình đau đớn nhưng tôi tin rằng không có sự thay thế nào ngoại trừ việc sử dụng trình tự như được đề cập trong bài viết này.


1
Bạn có thể sử dụng ALTER TABLE ... SWITCHđể chỉ chuyển đổi siêu dữ liệu mà không cần phải chạm vào dữ liệu. ví dụ: Xem cách đặt tăng tự động sau khi tạo bảng mà không mất dữ liệu?
Martin Smith

1
Quá trình được đề cập trong liên kết do bạn cung cấp liên quan đến việc chuyển dữ liệu sang bảng tạm thời và ngược lại, điều này đồng ý với tuyên bố của tôi ở trên. Nếu tôi sai xin vui lòng cung cấp cho tôi một ví dụ làm việc.
Softec

1
Có một ví dụ hoạt động trong liên kết. Không có "chuyển dữ liệu vào bảng tạm thời và quay lại". `ALTER TABLE ... SWITCH` là siêu dữ liệu chỉ thay đổi. Nó không di chuyển bất kỳ dữ liệu.
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.