Câu hỏi SQL Server thêm tự động tăng khóa chính cho bảng hiện có


Như tiêu đề, tôi có một bảng hiện có đã được phổ biến với 150000 bản ghi. Tôi đã thêm một cột Id (hiện tại là null).

Tôi giả sử tôi có thể chạy một truy vấn để điền vào cột này với số gia tăng, và sau đó đặt làm khóa chính và bật tăng tự động. Đây có phải là cách chính xác để tiếp tục không? Và nếu có, làm cách nào để điền vào các số đầu tiên?


190
2018-02-01 12:11


gốc




Các câu trả lời:


Không - bạn phải làm điều đó theo cách khác: thêm nó ngay từ khi bắt đầu INT IDENTITY - nó sẽ được lấp đầy với các giá trị nhận dạng khi bạn thực hiện việc này:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

và sau đó bạn có thể biến nó thành khóa chính:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

hoặc nếu bạn thích làm tất cả trong một bước:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

332
2018-02-01 12:15



Đây là một câu trả lời thực sự tốt, nhưng làm thế nào tôi có thể thay đổi số nguyên bắt đầu từ 1 đến 1000? Tôi muốn bắt đầu đếm ở 1000. Tôi nghi ngờ tôi có thể sử dụng ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1 nhưng tôi không muốn thử nó mà không kiểm tra với một chuyên gia :) Ref. pic.dhe.ibm.com/infocenter/iseries/v7r1m0/… - user1477388
Tôi chỉ sử dụng điều này và có vẻ như nó đã hoạt động alter table attachments add ATTACHMENT_NUMBER int identity (1000, 1) - user1477388
@stom: nếu bạn không chỉ định bất cứ điều gì, seed = 1 và increment = 1 sẽ được sử dụng - đó là cài đặt được sử dụng thường xuyên nhất. Nếu bạn đã tạo một bảng như thế này - nó sẽ hoạt động tốt. Nhưng tôi khuyên bạn nên luôn chỉ định rõ ràng hạt giống và gia tăng trong các tập lệnh SQL của bạn - đặc biệt là cho một trang web lớn hơn. Nó chỉ là thực hành tốt. - marc_s
@stom: tốt, PRIMARY KEY ngụ ý rằng NOT NULL được đưa ra - một lần nữa - nó không hoàn toàn cần thiết. Nhưng tôi thích trở thành rõ ràng và vì vậy tôi luôn có NOT NULL ở đó, chỉ để được hoàn toàn rõ ràng - marc_s
@ turbo88: khi bạn xác định PRIMARY KEY, chỉ mục nhóm được tạo tự động cho bạn (trừ khi bạn chỉ định rõ ràng NONCLUSTERED) - marc_s


Bạn không thể "bật" IDENTITY: đó là một bảng xây dựng lại.

Nếu bạn không quan tâm đến thứ tự số, bạn sẽ thêm cột, NOT NULL, với IDENTITY trong một lần. 150 nghìn hàng không nhiều lắm.

Nếu bạn cần phải bảo tồn một số thứ tự số, sau đó thêm các số cho phù hợp. Sau đó, sử dụng trình thiết kế bảng SSMS để đặt thuộc tính IDENTITY. Điều này cho phép bạn tạo ra một kịch bản mà sẽ làm các cột thả / thêm / giữ số / reseed cho bạn.


18
2018-02-01 12:17



OP là trên SQL Server 2008 vì vậy có một cách - Martin Smith
@ Martin: thú vị chúng ta có thể lộn xộn xung quanh với các bảng hệ thống một lần nữa ... - gbn
Toàn bộ cá thể cần phải được bắt đầu ở chế độ người dùng đơn lẻ, vì vậy có thể không khả thi trong hầu hết các trường hợp nhưng ALTER TABLE ... SWITCH có thể làm điều đó mà không có điều đó. - Martin Smith


Tôi gặp sự cố này nhưng không thể sử dụng cột nhận dạng (vì nhiều lý do khác nhau). Tôi đã giải quyết vấn đề này:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

Được mượn từ đây.


9
2017-09-20 17:38





Nếu cột đã tồn tại trong bảng của bạn và nó là null, bạn có thể cập nhật cột bằng lệnh này (thay thế id, tablename và tablekey):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x

3
2017-07-14 14:50



Bạn đã tiết kiệm thời gian cho tôi! Phụ lục tốt cho câu trả lời của @ gbn. - Kristen Waite


Khi chúng ta thêm và nhận dạng cột trong một bảng hiện có, nó sẽ tự động điền vào không cần phải điền nó theo cách thủ công.


2
2018-02-06 10:26





bởi nhà thiết kế, bạn có thể thiết lập bản sắc (1,1) nhấp chuột phải vào tbl => desing => ở phần bên trái (nhấp chuột phải) => properties => trong cột nhận dạng chọn #column

Tính chất

cột tư tưởng


1
2017-07-31 18:55



Bạn có thông tin về việc đây có phải là cách tiếp cận tốt không? OP hỏi xem đó có phải là "cách tiến hành chính xác" hay không. Một câu trả lời hoàn chỉnh hơn có thể giúp họ biết những ưu / khuyết điểm của phương pháp tiếp cận này. - jinglesthula
Thực sự tôi đang sử dụng tùy chọn này trong môi trường phát triển, nếu bạn chuyển thay đổi này sang sản xuất, bạn nên xác minh với VIEW DEPENDENCY nếu trường nhận dạng đang được một số trình kích hoạt Cửa hàng o kích hoạt. - gustavo herrera


Đây là một ý tưởng bạn có thể thử. Bảng gốc - không có bảng danh tính 1 tạo bảng mới - gọi bảng 2 cùng với cột nhận dạng. sao chép dữ liệu từ bảng 1 đến bảng 2 - cột nhận dạng được điền tự động với số tăng tự động.

đổi tên bảng gốc - table1 thành table3 đổi tên bảng mới - table2 thành table1 (bảng gốc) Bây giờ bạn có bảng 1 với cột nhận dạng được bao gồm và được điền cho dữ liệu hiện có. sau khi đảm bảo không có vấn đề và hoạt động đúng cách, hãy bỏ bảng 3 khi không còn cần thiết nữa.


0
2017-07-20 15:40