2010-02-08 46 views
13

Tôi có một bảng trong SQL Server 2005 chứa 10000054 bản ghi; các bản ghi này được chèn vào thông qua thao tác chèn số lượng lớn. Bảng không chứa khóa chính và tôi muốn có một khóa. Nếu tôi cố gắng sửa đổi cấu trúc của bảng, thêm một cột mới, PK, được đặt làm int với tính xác thực, bảng điều khiển quản lý sẽ cho tôi cảnh báo:Thêm khóa chính vào bảng có nhiều bản ghi

"Thay đổi bảng với lượng lớn dữ liệu có thể mất một lượng thời gian đáng kể Trong khi các thay đổi đang được lưu, dữ liệu bảng sẽ không thể truy cập được. "

sau đó kết quả đầu ra lỗi:

".. Không thể sửa đổi các bảng Timeout hết hạn Khoảng thời gian chờ trôi qua trước khi hoàn thành các hoạt động hoặc máy chủ không được đáp ứng "

Tôi muốn có một PK vào bàn của tôi.

Tôi có thể thêm nó bằng cách nào?

Trả lời

8

tạo một bảng mới với lược đồ chính xác và tạo cột mong muốn làm khóa chính. Bây giờ sử dụng chọn để chèn sao chép các bản ghi từ một bảng khác. Khi hoàn tất, sau đó xóa bảng cũ và đổi tên bảng mới này thành tên bạn muốn.

+0

Điều này làm việc tốt cho tôi. Có thể có một cách tốt hơn, nhưng đây là một sửa chữa nhanh chóng. – Induster

+0

Tôi nghĩ rằng giải pháp ưa thích (và đơn giản nhất) đang thay đổi thiết lập thời gian chờ thiết kế, như [được mô tả trong MSDN tại đây] (https://support.microsoft.com/en-us/kb/915849). – Veverke

+0

Không phải lúc nào cũng đảm bảo có không gian để thực hiện việc này. – Robino

2

Cố gắng tạo tập lệnh SQL và phát hành nó từ cửa sổ truy vấn SQL.

22

Nếu trong Management Studio bạn đặt khóa chính trong dạng xem thiết kế (không lưu), khi bạn nhấp chuột phải vào tùy chọn "Tạo kịch bản thay đổi" - tùy chọn này cũng có sẵn trên menu "Trình thiết kế bảng" tại hàng đầu.

Điều đó cung cấp SQL thô (được bao bọc an toàn trong giao dịch) mà bạn có thể sao chép vào khay nhớ tạm, chuyển qua để chạy dưới dạng Truy vấn mới (nút trên cùng bên trái hoặc Tệp> Mới> Truy vấn với kết nối hiện tại), dán trong, chọn đúng DB và thực hiện truy vấn.

+0

Bằng cách này, bạn có thể thiếu dung lượng đĩa trong một thời gian. – iMatoria

0

bạn có thể tạo một bảng có khóa chính. khi chèn dữ liệu bằng bcp, bạn có thể sử dụng tệp định dạng để ánh xạ các cột. định dạng tập tin để sao chép số lượng lớn là một giải pháp tốt. với giải pháp này, bạn chèn dữ liệu với thông tin nhận dạng.

0

Từ bạn trả lời cho David tôi nhận được bạn không có cột phù hợp cho khóa chính. Trong trường hợp này, bạn có thể thêm nhận dạng int làm cột cuối cùng của bảng, chèn hàng loạt sẽ tiếp tục hoạt động.

Khi bảng được nạp với số lượng lớn chèn, tùy chọn tốt nhất sẽ cắt ngắn bảng (cắt bảng MYTBL); thay đổi nó, thêm ID (thay đổi bảng TBL thêm ID int nhận dạng khóa chính) và tái phát hành tải số lượng lớn.

Nếu bạn không thể rebulk bảng bạn có thể sử dụng tem hoặc giải pháp hassan để thay đổi bảng.

9

Tôi biết điều này là cũ hơn nhưng tôi chạy vào điều này và giải quyết nó một cách khác nhau. Giả sử bạn đang sử dụng SSMS 2008, bạn có thể vào Công cụ -> Tùy chọn

Trong 'Nhà thiết kế' rồi 'Bảng và Nhà thiết kế cơ sở dữ liệu', thay đổi giá trị 'Hết thời gian giao dịch' sau . Mặc định là 30, 0 là vô hạn. Hãy thử tạo khóa chính sau khi tăng giá trị.

Điều này có xu hướng nhanh hơn rất nhiều; tạo một DB mới, sao chép dữ liệu, xóa Db cũ và đổi tên db mới thành db cũ.Sau khi bạn đã hoàn thành việc áp dụng Khóa chính, bạn có thể đặt thời gian chờ quay lại 30 - nếu bạn muốn, lựa chọn của bạn.

+1

Trong SSMS 2008 R2, bạn không thể đặt 'Giao dịch hết giờ sau' = 0. –

+1

Câu trả lời này có thể là tùy chọn của Microsoft: https://support.microsoft.com/en-us/kb/915849 –

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