2009-06-08 82 views
5

Tôi đang cố gắng thay đổi bảng trong máy chủ SQL bằng tập lệnh. Trong quá khứ tôi đã luôn thực hiện loại điều này thông qua một GUI, nhưng bây giờ tôi cần phải tạo ra một kịch bản để làm điều đó cho khách hàng.Chèn cột giữa các cột khác trong SQL Server bằng cách sử dụng tập lệnh

Tôi có một bảng cơ sở dữ liệu SQL Server đó là như thế này:

 
MyTable 
------- 
ColA int NOT NULL 
ColB int NOT NULL 
ColC int NOT NULL 
ColD VARCHAR(100) 

Mấu chốt chính được xác định trên Cola, ColB, và ColC.

Tôi muốn các kịch bản SQL để thay đổi bảng những thứ tương tự như vậy:

 
MyTable 
------- 
ColA int NOT NULL 
ColB int NOT NULL 
ColX int NOT NULL (new column, default 0 for existing data) 
ColC int NOT NULL 
ColD VARCHAR(100) 

Mấu chốt chính hiện nay sẽ được xác định bởi Cola, ColB, ColX, và ColC.

Điều này rất dễ thực hiện thông qua GUI của máy chủ SQL. Nhưng khi tôi có nó tạo ra một kịch bản từ đó, nó có vẻ phức tạp không cần thiết. Về cơ bản, kịch bản tạo một bảng tạm thời với lược đồ mới, sao chép tất cả dữ liệu, chỉ mục và các ràng buộc từ bảng cũ vào bảng tạm thời, xóa bảng cũ, sau đó đổi tên bảng mới thành tên cũ. Ngoài ra, nó có các dòng như sau:

ALTER TABLE dbo.Tmp_MyTable ADD CONSTRAINT 
    MyTable21792984_ColC_DF DEFAULT ((0)) FOR ColC 

Tôi lo ngại rằng những con số ngẫu nhiên này ở đó (tức là 21792984) sẽ không giống nhau trên tất cả các phiên bản cơ sở dữ liệu khách hàng. Chúng trông giống như một cái gì đó mà máy chủ SQL tạo ra khi tạo cơ sở dữ liệu duy nhất cho mỗi cá thể.

Có cách nào thay đổi thẳng hơn bảng thông qua các lệnh SQL không? Tôi đã xem trực tuyến nhưng những gì tôi đã tìm thấy chủ yếu là cơ bản và/hoặc chung chung.

Cập nhật: Từ các câu trả lời tôi nhận được, có vẻ như khó khăn nằm trong việc đặt cột mới "ở giữa" hai cột. Tôi đã nhận ra nó không thực sự quan trọng đối với thứ tự các cột trong (nếu tôi cảm thấy tự do để lại câu trả lời đúng). Trong trường hợp của tôi, sự thay đổi đơn giản hơn rất nhiều nếu tôi chỉ thêm cột vào cuối bảng và không có gì trong mã dựa trên thứ tự cột cụ thể.

Trả lời

8

Không có cách nào khác để chèn cột trong bảng SQL Server "ở giữa" cột hiện tại - bạn cần xây dựng bảng tạm thời và xây dựng lại bảng cũ. Điều đó nói rằng, thứ tự cột không quan trọng - bạn có chắc chắn rằng cột cần được chèn vào theo thứ tự không?

Có khả năng đặt cược tốt nhất của bạn là chỉ sử dụng GUI, viết kịch bản, sau đó thay đổi tên ràng buộc thành cái gì đó hợp lý trong tập lệnh. Bạn nói đúng rằng tên ràng buộc số không phải là lý tưởng, và nó không phải là một thực hành tốt nhất để cho phép SQL Server xác định tên đối tượng của bạn.

+0

Cảm ơn, khi kiểm tra thêm, thứ tự cột không quan trọng (ngoại trừ thẩm mỹ). Chỉ thêm cột vào cuối làm cho nó trở thành một nhiệm vụ dễ dàng hơn nhiều. – Kip

+0

Nếu bạn thực sự muốn thay đổi thứ tự, bạn có thể sử dụng Thứ tự cột lực trong SQL So sánh để thực hiện việc này. Điều này đòi hỏi phải xây dựng lại bảng đầy đủ, vì vậy có thể mất thời gian nếu bạn có nhiều dữ liệu. Dữ liệu hiện có sẽ được bảo toàn bằng So sánh SQL. –

3

Nếu bạn đang chèn một trường vào giữa bảng, về cơ bản bạn phải thả bảng hiện tại và tạo lại nó là máy chủ sql đang làm gì.

Các số ngẫu nhiên đảm bảo ràng buộc có một tên duy nhất. Nếu bạn giữ tập lệnh và chạy nó trên nhiều cơ sở dữ liệu, thì tất cả chúng sẽ giống nhau. Nếu bạn định sửa đổi từng cái thông qua gui, thì có thể chúng sẽ khác nhau.

Để sửa đổi khóa chính, tất cả những gì bạn cần làm là tìm ra tên ràng buộc khóa chính và thả nó. Chỉ cần thêm một ràng buộc mới xác định khóa chính. Điều này giả định rằng bạn không có khóa chính được liệt kê dưới dạng khóa ngoại ở đâu đó khác.

1

Nếu bạn muốn cột ở giữa như vậy, đó là những gì bạn phải làm. Tôi đã tìm thấy các kịch bản nó tạo ra khá tốt về chỉ bao gồm cả công việc neceessary.

Nếu bạn đã thêm một cột vào cuối ví dụ, bạn sẽ chỉ cần làm:

ALTER TABLE ADD COLUMN ColX int NOT NULL DEFAULT(0) 

Và bạn sẽ thấy điều này trong kịch bản nó tạo ra.Để thay đổi khóa chính, nó có thể bị xóa (trên tất cả các cột hiện có) và được tái tạo mà không cần viết lại bảng, nhưng nếu nó được nhóm lại hay không, bạn có thể sẽ nhận được một kịch bản lệnh khác.

1

Lấy mã mẫu & sửa đổi. Nếu bạn muốn cột được đặt ở một vị trí cụ thể, bạn sẽ phải đi đến bảng tạm thời định nghĩa lại/đổi tên tuyến đường. Bạn cũng có thể đặt tên cho các chỉ mục và các ràng buộc theo cách này.

1

Bạn sử dụng công cụ nào để tạo tập lệnh. Tôi sử dụng Red-Gate Sql compare tool và nó hoạt động rất đẹp.

+0

Tôi chỉ sử dụng Microsoft SQL Server Management Studio, mà tôi nghĩ rằng đi kèm với SQL Server. – Kip

2

Nếu trong số CREATE TABLE bạn chỉ định, PRIMARY KEY (ColA, ColB, ColC), bạn đã nói với SQL Server rằng bạn không quan tâm đến tên của ràng buộc này, bạn sẽ không bao giờ phải tham chiếu trực tiếp - vì vậy SQL Server hoàn toàn hợp lý trong việc tạo ra một số tên duy nhất bán ngẫu nhiên cho nó, giống như MyTable21792984_ColC_DF mà bạn phải lo lắng một cách đúng đắn (mặc dù điều đó có vẻ là ràng buộc một cột đơn lẻ ColC, cùng một kiểu đặt tên sẽ áp dụng cho các ràng buộc khác).

Mặc dù vấn đề này có thể là quá muộn để sửa chữa cho lược đồ hiện tại của bạn, nó sẽ giúp bạn trong tương lai nếu bạn tuân theo nguyên tắc luôn đặt tên cho các ràng buộc của bạn - vì thông thường bạn có thể cần phải tham khảo cho họ trong tương lai, vì vậy bạn muốn tên hoàn toàn nằm dưới sự kiểm soát của bạn, giống như tên của bất kỳ đối tượng lược đồ nào khác (bảng, cột, v.v ...). Trong trường hợp này, việc sử dụng mệnh đề như CONSTRAINT PK_MyTable PRIMARY KEY (ColA, ColB, ColC) trong số CREATE TABLE sẽ giúp ích. (Nếu các công cụ GUI bạn đang sử dụng cho các nhiệm vụ DBA của bạn không cho phép bạn kiểm soát loại điều này, chúng không phải là các công cụ thích hợp cho một DBA: tìm những công cụ tốt hơn! -).

+0

Thật không may tôi đang đến dữ liệu hiện có, vì vậy tôi không có bất kỳ kiểm soát đối với cách cơ sở dữ liệu được tạo ra. Nhưng ít nhất họ cũng đặt tên cho khóa chính của họ là PK_TableName. – Kip

2

Không phải là cách hay để phụ thuộc vào bất kỳ thứ tự các cột "tự nhiên" hoặc "cố hữu" nào trong bảng cơ sở dữ liệu. Tất cả các cột nên được tham chiếu theo tên trong bất kỳ truy vấn được tạo chính thức nào để trả lại cột theo tên theo thứ tự được chỉ định bởi truy vấn. Nếu quy tắc đó không được theo sau, bất kỳ thay đổi lược đồ nào trong tương lai là một cơn ác mộng tuyệt đối vì mã hệ thống có thể cần được thay đổi mỗi khi lược đồ cơ sở dữ liệu được cập nhật.

Điều khó chịu duy nhất ở đây sẽ là khi chạy truy vấn một lần bằng cách sử dụng SELECT * FROM ... trên cơ sở dữ liệu sản xuất/kiểm tra/phát triển do người dùng mã hóa và có cột mới hiển thị ở cuối danh sách cột. Tuy nhiên, tôi tin rằng nhiều công cụ truy vấn sẽ cho phép bạn sắp xếp lại các cột từ một loại GUI.

3

Tôi chỉ muốn chỉ ra lý do tại sao bạn không bao giờ muốn sử dụng GUI để chèn một cột vào giữa bảng hiện có. Khi bạn làm điều đó, tạo ra một bảng mới speatare, di chuyển dữ liệu từ bảng cũ, đổi tên bảng cũ, đổi tên bảng mới thành tablename cũ và loại bỏ bảng cũ. Điều này là đủ xấu nếu bạn havea databaset nhỏ. Trong một thế giới sản xuất nơi các bảng có thể khá lớn, bạn có thể khóa người dùng ra khỏi bảng trong vài giờ. Bất kỳ thiết kế cơ sở dữ liệu nào mà thứ tự các cột trong cơ sở dữ liệu cần được sắp xếp lại khi một cột mới được thêm vào là một cơ sở dữ liệu hướng đến thảm họa.Bởi vì có những người nhấn mạnh vào việc này mặc dù, đó là một lý do khác tại sao Select * cũng là một vấn đề đang chờ xảy ra. Bạn thực sự không muốn trạng thái hiển thị trong cột zip của mình trong báo cáo vì ai đó đã sắp xếp lại các cột trong bảng và bạn dựa vào lựa chọn * từ thứ tự cột.

+0

Giao diện GUI có vẻ rất đơn giản để sắp xếp lại các cột - đặc biệt vì chúng thường được sử dụng trên cơ sở dữ liệu phát triển nhỏ, nơi hiệu suất nhân đôi bảng là không đáng kể - tôi không biết nhiều việc đang diễn ra đằng sau hậu trường! – Kip

+3

Oh và bạn không bao giờ nên làm dev trên cơ sở dữ liệu nhỏ hơn đáng kể so với cơ sở dữ liệu prod của bạn. Các truy vấn hoạt động tốt nhất cho các tập dữ liệu nhỏ KHÔNG phải là các truy vấn hoạt động tốt nhất cho các tập dữ liệu lớn. Điều này gây ra hệ thống thực hiện rất xấu. – HLGEM

0

Thêm cột mới vào bảng hiện có (được thêm vào cuối tất cả các cột) Sau đó tạo bảng mới sử dụng bảng này và trong truy vấn phụ được sử dụng để tạo bảng mới, đề cập đến các cột trong thứ tự mà bạn muốn họ trong bảng mới ..

Ex:

create table person(name varchar2(10),age number); 
alter table person add salary number; (now salary is added at last position) 
desc person 
name ... 
age ... 
salary ... so now salary is at the end. 

nói bây giờ tôi muốn tạo bảng nhân viên sử dụng bảng người này.

create table employee as select name,salary,age from person; 

khi bạn mô tả bảng nhân viên, nó có định nghĩa như bảng người như AS WELL AS DATA.

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