2010-12-09 55 views
15

Tôi có một bảng cũ với FK trong đó. Tôi muốn thêm một cột mới. Tôi sẽ muốn tạo cột mới này là khóa chính của tôi. Vì vậy, tôi nghĩ rằng tôi có thể chèn cột đó làm cột đầu tiên hoặc chèn vào cuối bảng của tôi và sắp xếp lại các cột của tôi sau đó.Tại sao tôi không thể sắp xếp lại các cột SQL Server của mình?

Nhưng SQL Server Management Studio không cho phép tôi làm điều đó. Tôi hiểu rằng tôi không thể làm điều đó, và thứ tự cột đó gần như hoàn toàn không liên quan trong SQL.

Những gì tôi muốn biết, là làm thế nào đến ... Ý tôi là, tôi có thể thả một cột ... không phải là điều tương tự như thêm một cái mới?

Tôi chỉ đang cố gắng hiểu những gì đang xảy ra. Tôi đã có một thời gian khó tìm tài liệu cho điều đó. Nếu bất cứ ai có thể chỉ cho tôi theo hướng tốt.

+1

Bạn có thể cho chúng tôi biết bạn đang sử dụng phiên bản máy chủ sql nào và thông báo lỗi chính xác mà bạn nhận được là gì? Tôi đoán nó có thể là một thiết lập mà sẽ không cho phép bạn thực hiện các thay đổi đòi hỏi một bảng để được tái tạo. – Ryan

+0

Xin lỗi vì sự chậm trễ, bên làm việc Giáng sinh đã trì hoãn công việc của tôi hehe. Tôi đang sử dụng MSSQL Server 2008 R2 (studio quản lý). Thông báo lỗi là: "Không cho phép thay đổi lưu. Những thay đổi bạn đã thực hiện yêu cầu các bảng sau phải bị xóa và tạo lại. Bạn đã thực hiện thay đổi đối với bảng không thể được tạo lại hoặc bật tùy chọn Ngăn chặn lưu các thay đổi yêu cầu bảng được tạo lại. " –

+0

bản sao có thể có của [Tôi có thể sắp xếp lại các cột một cách hợp lý trong một bảng không?] (Http://stackoverflow.com/questions/1610/can-i-logically-reorder-columns-in-a-table) – bummi

Trả lời

5

Bạn có thể quan tâm đến câu trả lời cho this question.

tại sao bạn không thể sắp xếp lại các cột (ngoài các câu trả lời cụ thể của SSMS được đăng), tôi không chắc bạn sẽ tìm thấy câu trả lời chuẩn, khác với chuẩn SQL không chứa cú pháp lập trình để làm do đó - cách duy nhất để xác định lại lược đồ của bảng (bao gồm thứ tự các cột của nó) là để thả bảng và tạo lại nó. Vì vậy, bất kỳ ứng dụng quản lý nào cung cấp cột "sắp xếp lại" nhiều khả năng sẽ làm điều đó đằng sau hậu trường (ví dụ: Chế độ xem thiết kế của SSMS, như được chỉ ra trong câu hỏi được liên kết).

Ai đó có kiến ​​thức sâu hơn về đặc tả SQL có thể mâu thuẫn với điều này nếu có lý do rõ ràng vì không cung cấp cơ chế sắp xếp lại cột như một phần của DDL chuẩn, nhưng tôi chỉ có thể phỏng đoán. của các cột trong resultsets của họ anyway, và DBMSes kiểm soát lưu trữ vật lý theo thực hiện cá nhân của họ, thứ tự cột hợp lý về cơ bản là vô nghĩa và không đảm bảo một cơ chế như vậy.

+4

Thực tế là thứ tự cột không cung cấp giá trị trong ngữ cảnh của bất kỳ câu lệnh SQL nào là hợp lý đối với tôi - bạn chọn bất kỳ cột nào bạn thích, theo bất kỳ thứ tự nào bạn muốn. –

+0

Đồng ý. Tôi đoán tôi đã cố gắng để đủ điều kiện tuyên bố của tôi bằng cách chỉ ra rằng có thể có hoặc không có thể là một lý do rõ ràng hơn. Nhưng tôi đồng ý rằng tôi không nghĩ rằng cần phải có một. –

+0

Tôi nghĩ đây là câu trả lời cho câu trả lời tôi nhận được. Cảm ơn rất nhiều! Tôi nghĩ rằng nó có ý nghĩa rằng nếu không có nhu cầu hợp lý cho điều này, người tạo SQL sẽ không bao gồm chức năng dẫn đến một tính năng gần như vô dụng. –

6

cột Sắp xếp lại về cơ bản là giống như làm lại bảng, đó là cách giải quyết nếu thay đổi yêu cầu vui chơi giải trí bị vô hiệu hóa:

SELECT (fields in DESIRED order) 
INTO MyNewTable 
FROM OldTable 
1

Nếu nghi ngờ của tôi là chính xác, bạn đã bật cài đặt mà bạn cần tắt để cho phép các thay đổi yêu cầu phải tạo lại bảng để lưu lại.

mở SQL Management Studio và sử dụng menu để đi đến Tools-> Options

Trong các tùy chọn menu bên trái chọn nhà thiết kế

Trong Bảng Tùy chọn pane bên phải đảm bảo rằng hộp kiểm bên cạnh đến cài đặt "Ngăn chặn lưu thay đổi yêu cầu tạo lại bảng" không được chọn.

Sau khi bạn xác nhận đã xong, hãy thử sắp xếp lại các cột của bạn một lần nữa.

+0

Thực tế nó hoạt động. Bây giờ tôi cần phải biết nếu nó an toàn, và vẫn còn lý do tại sao chúng tôi không thể làm điều này mà không cần tái tạo bảng. Cảm ơn –

22

Chắc chắn bạn có thể. Bỏ chọn tùy chọn này trong SQL Server Management Studio:
Công cụ> Tùy chọn> Nhà thiết kế> Ngăn thay đổi lưu yêu cầu giải trí bảng.

Options dialog

+7

Hy vọng rằng nó không cần thiết phải nói nhưng bị bệnh nói nó anyway. Điều này có thể giết chết các bảng. Nếu bạn đi bất cứ nơi nào gần cơ sở dữ liệu sản xuất, tôi khuyên bạn nên bật lại cờ đó ngay khi bạn thực hiện thay đổi! – Robb

+0

Tôi hoàn toàn đồng ý, đặc biệt cho các bảng lớn nó có thể thực sự có hại. –

+0

Điều này đã làm việc cho vấn đề của tôi. Tôi đã tìm kiếm tùy chọn này trong thuộc tính của bảng. Bảng hiện tại của tôi có 66 hàng và 1 FK cho một bảng ngôn ngữ. Tôi sẽ thử nó xem nếu nó phá vỡ công cụ của tôi. Cảm ơn!! –

0

Những gì tôi muốn biết là làm thế nào mà ... Ý tôi là, tôi có thể thả một cột ... mà không phải là điều tương tự như thêm một cái mới?

Thả cột dựa trên tên cột, không phải vị trí thứ tự (cột thứ nhất/thứ hai/thứ ba/v.v ...). Việc thêm một cột luôn được nối vào cuối danh sách các cột. Điều này củng cố rằng chuỗi các cột hoàn toàn không liên quan đến dữ liệu ngoài các hoạt động SQL. Tôi không biết làm thế nào bạn nhìn thấy hoặc là tương tự ...

Không có cơ sở dữ liệu SQL Tôi biết hỗ trợ chèn cột theo thứ tự cụ thể vào bảng hiện có. PHPMyAdmin cung cấp chức năng, nhưng dưới bao gồm các chức năng là tạo ra một bảng mới với thứ tự cột mong muốn, sao chép dữ liệu từ cũ sang bảng mới, và cuối cùng xóa/bỏ bảng cũ.

Thứ tự cột không mang lại lợi ích cho hoạt động ...

+5

Nó * * cung cấp một lợi ích cho các nhà phát triển hơi OCD, tuy nhiên ...;) –

+0

@djacobson: Tôi phải hỗ trợ các DBA với các yêu cầu OCD như vậy - lãng phí thời gian, tiền bạc và tài nguyên. Thực tế thống kê rằng bạn càng thay đổi, càng có nhiều/có thể sẽ bị sai. –

+0

Woof. Thật không may. Giải pháp của bạn là viết trình tạo tập lệnh có thể trích xuất một câu lệnh 'CREATE TABLE' mới cho bảng đã cho với các cột theo thứ tự mong muốn, cùng với bảng thả xuống và các câu lệnh sao chép dữ liệu có liên quan và thực hiện điều đó trên cơ sở dữ liệu ? :) –

0

Bạn KHÔNG muốn làm điều đó trừ khi bảng không có dữ liệu và KHÔNG được sản xuất! Lý do là nó phải lấy các bản ghi hiện có ra một bảng tạm thời, xóa bảng cũ, đổi tên bảng tạm thời. Đây là một điều rất xấu để làm cho một bảng hiện có trong sản xuất. Nó là ngu ngốc để dựa vào thứ tự cột trong truy vấn anyway, vì vậy đây là một nhiệm vụ hoàn toàn không cần thiết. Đây là cái gì đó có thể gây đau lớn cho nghĩa đen không có được. Đừng đi xuống con đường này ngay cả khi bạn tìm được cách giải quyết.

+0

Xin chào HLGEM, xin vui lòng đọc bài viết của tôi một cách cẩn thận, tôi không thực sự muốn làm điều này :) Những gì tôi thực sự muốn là để biết lý do tại sao một người nào đó không thể làm điều này. Nhưng cảm ơn những cảnh báo mặc dù hehe :) –

+0

Bạn chỉ có thể làm điều đó bằng cách tạo một bảng và di chuyển dữ liệu đến đó. Đó là lý do tại sao nó là một ý tưởng tồi và tại sao nó không được phép nói chung vì nó có thể tạo ra các vấn đề to lớn với truy cập cơ sở dữ liệu hiện có nếu bạn làm điều đó. – HLGEM

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