2011-02-01 38 views
182

Như tiêu đề, tôi có một bảng hiện có đã được điền với 150000 bản ghi. Tôi đã thêm một cột Id (hiện tại là null).Máy chủ SQL thêm tự động tăng khóa chính vào bảng hiện có

Tôi giả sử tôi có thể chạy 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?

Trả lời

310

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

ALTER TABLE dbo.YourTable 
    ADD ID INT IDENTITY 

và sau đó bạn có thể làm nó 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 
+0

Tôi đang sử dụng giao diện phpMyAdmin. Tôi đã gặp lỗi SQL khi cố gắng sử dụng từ khóa 'IDENTITY', cũng không có sẵn trong GUI. Nó hoạt động khi tôi thêm một hàng mới với AUTO_INCREMENT được chọn và kiểu của nó là INT PRIMARY. – daveagp

+0

Từ khóa Identity là SQL Server cụ thể. Auto_Increment là phiên bản MySQL như bạn tìm thấy. http://stackoverflow.com/questions/10283780/equivalent-of-mssql-identity-column-in-mysql – AndyMcKenna

+2

Đâ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 VỚI 1' nhưng tôi không muốn thử nó mà không cần kiểm tra với một chuyên gia :) Ref. http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fsqlp%2Frbafysqlpidentity.htm – user1477388

18

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 giữ lại một số thứ tự số, thì hãy thêm số tương ứng. 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.

+4

OP là trên SQL Server 2008 [vì vậy có một cách] (http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table-without-any- Mất dữ liệu/6086661 # 6086661) –

+1

@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

+0

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. SWITCH' có thể làm điều đó mà không có điều đó. –

-3

Hãy thử một cái gì đó như thế này (trên bảng thử nghiệm đầu tiên):

 
USE your_database_name 
GO 
WHILE (SELECT COUNT(*) FROM your_table WHERE your_id_field IS NULL) > 0 
BEGIN 
    SET ROWCOUNT 1 
    UPDATE your_table SET your_id_field = MAX(your_id_field)+1 
END 
PRINT 'ALL DONE' 

tôi đã không kiểm tra này ở tất cả, vì vậy hãy cẩn thận!

+1

-1 Không trả lời câu hỏi (đó là về việc thêm các cột 'IDENTITY') và sẽ không hoạt động. 'UPDATE your_table SET your_id_field = MAX (your_id_field) + 1' bạn không thể chỉ cần chuck trong' MAX' ở đó. Đâu là mệnh đề 'WHERE' để tránh liên tục cập nhật cùng một hàng? –

8

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 trên điều này:

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

Vay từ here.

2

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

2

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ác cột với 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 
+0

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. –

0

Dưới đây là một ý tưởng bạn có thể thử. Bảng gốc - không có bảng nhận dạng bảng1 tạo bảng mới - bảng gọi 2 cùng với cột nhận dạng. sao chép dữ liệu từ bảng 1 sang 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 có cột nhận dạng và được điền cho dữ liệu hiện có. sau khi đảm bảo không có sự cố và hoạt động đúng cách, hãy thả bảng 3 khi không còn cần thiết nữa.

0

Tạo bảng mới Với tên khác và cùng một cột, khóa chính và tổ hợp khóa ngoài và liên kết điều này trong câu lệnh Chèn mã của bạn. Ví dụ: Đối với EMPLOYEE, thay thế bằng EMPLOYEES.

CREATE TABLE EMPLOYEES(

    EmpId  INT NOT NULL IDENTITY(1,1), 
    F_Name  VARCHAR(20) , 
    L_Name  VARCHAR(20) , 
    DOB   DATE , 
    DOJ   DATE , 
    PRIMARY KEY (EmpId), 
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId), 
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId), 
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId) 
) 

Tuy nhiên, bạn phải xóa Bảng EMPLOYEE hiện tại hoặc thực hiện một số điều chỉnh theo yêu cầu của bạn.

-3

này hoạt động trong MariaDB, vì vậy tôi chỉ có thể hy vọng nó trong SQL Server: thả các cột ID bạn vừa chèn, sau đó sử dụng cú pháp sau: -

ALTER TABLE tên_bảng ADD id INT TIỂU AUTO_INCREMENT KEY ;

Không cần một bảng khác. Điều này chỉ cần chèn một cột id, làm cho nó trở thành chỉ mục chính và điền nó với các giá trị tuần tự. Nếu SQL Server sẽ không làm điều này, tôi xin lỗi vì đã lãng phí thời gian của bạn.

1

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 => trong phần bên trái (kích chuột phải) => properties => trong cột sắc chọn #column

Properties

idendtity column

+0

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

+0

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. –

0

Nếu bảng của bạn có mối quan hệ với các bảng khác sử dụng khóa chính hoặc foriegen của nó, có thể nó là không thể thay đổi bảng của bạn. vì vậy bạn cần phải thả và tạo lại bảng.
Để giải quyết những vấn đề này, bạn cần tạo Kịch bản bằng cách nhấp chuột phải vào cơ sở dữ liệu và trong loại tùy chọn nâng cao của dữ liệu để kịch bản cho lược đồ và dữ liệu. sau đó, sử dụng tập lệnh này với việc thay đổi cột của bạn để xác định và tạo lại bảng bằng cách chạy truy vấn của nó.
truy vấn của bạn sẽ như thế nào đây:

USE [Db_YourDbName] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
Drop TABLE [dbo].[Tbl_TourTable] 

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NULL, 
    [Family] [nvarchar](150) NULL) 

GO 

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1') 
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1') 
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1') 
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1') 
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1') 
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1') 
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1') 

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 
Các vấn đề liên quan