2011-12-28 63 views
10

Tôi có một bảng khoảng 10 triệu hàng. Chúng tôi vừa nhập từ cơ sở dữ liệu khác bằng SQL Server Management Studio. Nó tạo bảng nhưng không có nhận dạng và khóa chính trên cột khóa chính.Cách thêm danh tính vào cột trong SQL Server?

Tôi có thể thêm khóa chính nhưng không thể thêm danh tính. Đó là tất cả các thời gian thời gian ra khi tôi đang làm nó trong thiết kế. Ngay cả khi tôi đặt cài đặt hết giờ thành 0.

Tôi cần phải tạo một cột khác có thể đặt khóa và nhận dạng chính, sao chép dữ liệu từ cũ, xóa cột cũ và đổi tên cột mới.

Có ai có thể chỉ cho tôi cách tốt nhất để làm điều đó cho những bảng lớn như vậy, mà không có quá nóng quá mức không?

+0

Vì vậy, một cái gì đó như thế này đã cho bạn một thời gian chờ? 'alter table TableName thêm ID int identity (1, 1) primary key' –

+1

Bạn có thể sử dụng' ALTER TABLE ... SWITCH' để làm điều này gần như ngay lập tức. Ngay cả trên một bảng 10 triệu hàng. –

+0

có thể trùng lặp của [cách đặt tăng tự động sau khi tạo bảng mà không bị mất dữ liệu?] (Http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table - không có dữ liệu nào mất) –

Trả lời

4

Được rồi. Tôi đã có thể thêm danh tính vào cột chính hiện tại với 10 triệu bản ghi. Mất khoảng 30 phút.

Các bước:

  1. Thay đổi cơ sở dữ liệu để chế độ người dùng đơn (để đảm bảo không kết nối khác để databse, có thể gây ra khóa)

  2. mở bảng ở chế độ thiết kế

  3. Make thay đổi. Không lưu

  4. Bấm nút Generate Thay đổi Script (thường ở bên trái ngay trên Object Explorer)

  5. Sao chép tạo ra kịch bản
  6. Đóng nhà thiết kế cửa sổ (bạn có thể chỉ chạy một ví dụ tại thời điểm đó)
  7. Mở cửa sổ mới
  8. Thực thi tập lệnh

  9. Xong. Bây giờ cột của bạn có danh tính :)

+1

Kiểm tra tập lệnh. Tôi tích cực rằng nó tạo ra một bảng mới, sao chép tất cả các dữ liệu trên và sau đó giảm bảng gốc. – Bill

+1

Có thể đã thực hiện trong 30 giây nếu bạn đã theo dõi liên kết của tôi! –

11

Bạn không thể thêm IDENTITY vào cột hiện tại. Nó không thể được thực hiện.

Bạn sẽ cần phải tạo ra một mới cột kiểu INT IDENTITY và sau đó thả các cột cũ bạn không cần nữa (và có thể đổi tên các cột mới cho tên cũ - nếu điều đó là cần thiết)

Ngoài ra: Tôi sẽ không làm điều này trong trình thiết kế trực quan - điều này sẽ cố gắng tạo lại bảng với cấu trúc mới, sao chép trên tất cả dữ liệu (tất cả 10 triệu hàng), rồi thả bảng cũ. Việc sử dụng các câu lệnh T-SQL thẳng sẽ hiệu quả hơn nhiều - điều này sẽ thực hiện cập nhật "tại chỗ", không phá hủy (không có dữ liệu bị mất), và không cần sao chép khoảng 10 triệu hàng trong quá trình ...

ALTER TABLE dbo.YourTable 
    ADD NewID INT IDENTITY(1,1) NOT NULL 

Khi bạn thêm một cột mới của loại INT IDENTITY để bàn của bạn, sau đó nó sẽ được tự động điền số liên tiếp. Bạn không thể ngừng điều này xảy ra và bạn cũng không thể cập nhật các giá trị sau này.

Cả trong những lựa chọn thực sự rất hữu ích, cuối cùng - bạn có thể kết thúc với giá trị ID khác nhau .... để làm điều này đúng, bạn phải:

  • tạo bảng mới trước thời hạn, với cấu trúc hợp lý và IDENTITY đã ở vị trí
  • sau đó bật SET IDENTITY_INSERT (yourtable) ON trên bàn mà để cho phép các giá trị được chèn vào cột sắc
  • bản sao trên dữ liệu này từ nguồn gốc
  • tắt agai chèn nhận dạng n: SET IDENTITY_INSERT (yourtable) OFF

Chỉ với phương pháp này bạn mới có thể nhận cùng một ID trong cột IDENTITY trong bảng mới.

+1

Bạn có thể cho tất cả các mục đích và mục đích thêm 'danh tính' vào một cột hiện có bằng cách tạo một bảng mới có cùng cấu trúc ngoại trừ thuộc tính nhận dạng. Chuyển bảng cũ sang bảng mới, sau đó thả bảng cũ và đổi tên bảng. Điều này khiến các trang dữ liệu bị ảnh hưởng. –

+0

Tôi không đồng ý với bạn. Tôi chỉ cố gắng thêm cột chính và cột nhận dạng trên một bảng có hàng 800K ở chế độ thiết kế. Và nó đã hoàn thành thành công. – German

+0

@MartinSmith: và nó cũng hoạt động với hai bảng không phân vùng? –

2

Một cách để đặt cột identity là trong một insert với tùy chọn set identity_insert.Ví dụ, để thay đổi id trong bảng này để identity:

create table YourTable (id int, value varchar(50)) 

Bạn có thể sử dụng kịch bản này:

-- Create empty table as a copy of the original 
select top 0 * into YourTable_New from YourTable 

-- Drop the old ID column 
alter table YourTable_New drop column id 

-- Add a new ID column with identity 
alter table YourTable_New add id int identity 

-- Copy the old values into the identity column 
set identity_insert YourTable_New on 
insert YourTable_New (id, value) select id, value from YourTable 
set identity_insert YourTable_New off 

-- Drop the old table and rename the new one 
drop table YourTable 
exec sp_RENAME 'YourTable_New' , 'YourTable' 
3

Bạn có thể thêm IDENTITY vào cột hiện tại. Nó chỉ có thể được thực hiện. trong SSMS Chỉ cần đi đến các công cụ -> tùy chọn -> Nhà thiết kế -> Nhà thiết kế bảng và cơ sở dữ liệu và bỏ chọn tùy chọn Ngăn thay đổi lưu thay đổi yêu cầu tạo lại bảng.

Bây giờ, hãy thêm danh tính ở chế độ thiết kế vào cột bắt buộc và lưu.

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