16

Tại sao tôi nhận được thông báo rằng bảng cần giảm và tạo lại khi tôi thêm/di chuyển cột? Tôi tin rằng điều này xảy ra sau khi thêm các ràng buộc khóa ngoại.SQL Server Management Studio - Thêm/Di chuyển Cột yêu cầu thả và tạo lại?

Tôi có thể làm gì để thêm các cột mới mà không cần xóa bảng?

+6

Tôi trân trọng không đồng ý với quan điểm phổ biến mà trật tự không quan trọng. Khả năng đọc và tổ chức luôn quan trọng khi lập trình. Ví dụ, tôi luôn luôn như nhóm PK của tôi với nhau, không xen kẽ trong một bảng 50 cột. Đối với một ví dụ khác, một obfuscator về mặt kỹ thuật không quan trọng đối với chức năng của chương trình, nhưng nó (cố ý) làm cho mã thành một mớ hỗn độn khủng khiếp. IMO mong muốn đặt hàng các cột của bạn là một cột hoàn toàn tự nhiên. – Tekito

Trả lời

21

"Prevent saving changes that require table re-creation"

Nếu bạn quan tâm nhiều hơn trong chỉ đơn giản là nhận SSMS ngừng cằn nhằn, bạn có thể bỏ chọn "thay đổi tiết kiệm Ngăn chặn đòi hỏi bảng tái tạo "thiết lập" trong Options-> Designers-> Table And Database Designers. (Các) bảng sẽ vẫn bị loại bỏ và tái tạo, nhưng ít nhất SSMS sẽ không làm bạn thất vọng nhiều về nó.

(Điều này giả định bạn đang làm việc trong một môi trường dev/kiểm tra hoặc trong một môi trường sản xuất mà một sai sót ngắn ngủi trong sự tồn tại của bảng sẽ không vít bất cứ điều gì lên)

+1

Cảm ơn! Điều này sẽ làm việc cho thời điểm này nhưng một chút nguy hiểm :) – tvr

+1

Vui mừng khi nghe nó! Nhân tiện, SSMS cũng sẽ chuyển dữ liệu của bạn sang bảng mới. Tôi chưa bao giờ bị mất dữ liệu hoặc có bất kỳ vấn đề nào khác khi thực hiện theo cách này. Mặc dù tôi luôn luôn làm một bản sao lưu đầu tiên của khóa học! –

+0

Đây là một lời khuyên rất nguy hiểm!Không bao giờ bỏ chọn trường này hoặc bạn có thể vô tình mất tất cả dữ liệu của mình về các thay đổi cấu trúc. Quên giao diện người dùng và sử dụng TSQL để thay đổi bảng của bạn như được mô tả trong một trong các câu trả lời khác. – Jan

7

Vì đó là cách SQL Server Management Studio thực hiện điều đó (đôi khi)!

Sử dụng TSQL của ALTER TABLE thay vì:

ALTER TABLE 
    ADD myCol int NOT NULL 
+0

Điều gì về việc sắp xếp lại? :) – tvr

+1

@tvrsubs: Đặt hàng không thành vấn đề. [Xem này] (http://en.wikipedia.org/wiki/Obsessive_compulsive_disorder) – gbn

+2

Cảm ơn bạn đã liên kết. Có, tôi ám ảnh và bạn có thể thấy điều này http://www.answers.com/topic/cleanliness-is-next-to-godliness :) – tvr

0

Khi bạn chỉnh sửa một định nghĩa bảng trong thiết kế, bạn đang nói "ở đây là những gì tôi muốn bàn tới như thế nào, bây giờ làm việc ra những gì câu lệnh SQL phát hành để thực hiện mong muốn của tôi trở thành sự thật ". Điều này làm việc tốt cho những thay đổi đơn giản, nhưng phần mềm không thể đọc được suy nghĩ của bạn, và đôi khi nó sẽ cố gắng làm mọi thứ theo một cách phức tạp hơn cho sự an toàn. Khi điều này xảy ra, tôi đề nghị rằng, thay vì chỉ nhấp vào OK, hãy nhấp vào nút "Tập lệnh" ở đầu hộp thoại và để cho nó tạo các câu lệnh SQL vào một cửa sổ truy vấn. Sau đó, bạn có thể chỉnh sửa và đơn giản hóa mã được tạo trước khi thực thi nó.

+0

Xin lỗi tôi có thể tìm thấy nút "Tập lệnh" ở đâu? Cũng giống như menu "Bảng Tập lệnh dưới dạng"? – tvr

1

Máy chủ SQL (và bất kỳ RDBMS nào khác, thực sự) không có bất kỳ khái niệm nào về "thứ tự cột" - ví dụ: nếu bạn di chuyển cột xung quanh, cách duy nhất để đạt được cấu trúc bảng mới đó là ban hành một tuyên bố mới CREATE TABLE. Bạn không thể sắp xếp các cột của bạn theo bất kỳ cách nào khác - và bạn cũng không nên, thực sự, vì trong lý thuyết quan hệ, thứ tự của các cột trong một tuple là không liên quan.

Vì vậy, điều duy nhất SQL Server Management Studio có thể làm (và đã làm tất cả cùng) là:

  • đổi tên bảng cũ
  • tạo bảng mới trong cách bố trí mới của bạn, bạn muốn có
  • sao chép dữ liệu qua từ bảng cũ
  • thả bảng cũ

cách duy nhất để làm được việc này là:

  • không sắp xếp lại bất kỳ cột - chỉ thêm cột mới vào cuối bảng của bạn
  • sử dụng ALTER TABLE câu lệnh SQL thay vì thiết kế bảng tương tác cho công việc của bạn
+4

Mysql không có vấn đề gì với điều này .. – tvr

0

Có lỗi trong SSMS 2008 R2 (và cũ hơn) hữu ích để biết:

  • khi dữ liệu bảng được thay đổi, hiển thị trong SSMS được tự động SSMS trong các tab đã mở (cửa sổ) - một shou Nhấn Ctrl + R để làm mới.Các tùy chọn buộc làm mới không xuất hiện trong giao diện SSMS - thông qua các nút, menu hoặc tùy chọn nhạy cảm theo ngữ cảnh (khi nhấp chuột phải)
  • khi lược đồ (bảng hoặc cơ sở dữ liệu) được sửa đổi, như thêm/xóa/xóa cột một bảng, SSMS không phản ánh những thay đổi này trong các tab đã được mở (cửa sổ) ngay cả thông qua Ctrl + R, bạn nên đóng và mở lại các tab (cửa sổ)

Tôi đã báo cáo cách đây vài năm thông qua phản hồi Kết nối của Microsoft, nhưng lỗi đã bị đóng do đó là "theo thiết kế"

Cập nhật:
Điều này thật kỳ lạ và khó chịu khi thấy trong sản phẩm máy tính để bàn được phát triển trong 2 deca des, trong khi điều này (tự động làm) đang được thực hiện bởi hầu hết webapplications trong bất kỳ trình duyệt

+0

Tôi nên nói, những điều này có ý nghĩa vì làm điều này đòi hỏi một số chi phí bổ sung (tất nhiên họ có lẽ nên kiểm tra dấu thời gian hoặc một cái gì đó tương tự) – tvr

+0

Điều gì có ý nghĩa? - đó không phải là autorefresh cũng không nhận được lược đồ thực tế bằng cách buộc làm mới thủ công siêu dữ liệu mà không đóng và mở lại một cửa sổ? Cảm giác trong đó là gì? Nó không phải là chi phí, tức là không trì hoãn, người ta không thể có được đại diện đồ thị thay đổi (siêu dữ liệu) trong SSMS ở tất cả trong cửa sổ đã mở (trước khi thay đổi) một cách độc lập với độ trễ –

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