2012-02-06 34 views
15

Jestem studentem RDBMS.Dodaj kolumnę klucza podstawowego w tabeli SQL

Mam bardzo podstawowe pytanie, powiedzmy, że mam jedną istniejącą tabelę na serwerze SQL. Co będzie skryptem do zmiany tabeli.

  • Upuść kolumnę "RowId", jeśli istnieje.
  • Zrzuć ograniczenia, jeśli istnieją.
  • Dodaj jedną nową kolumnę "RowId" do tabeli.
  • Ustaw tę kolumnę jako klucz podstawowy.
  • Autoincjatura typ wew.
+1

Upuszczanie kolumny i usuwanie ograniczenia klucza podstawowego to różne rzeczy. Twoja pierwsza linia nie jest jasna. Czy możesz również opublikować swoją próbę i wyjaśnić, gdzie utknąłeś? – Oded

+0

Czego naprawdę chcesz? –

+0

Czy nie chcesz zachować "starego" wiersza, dopóki cała sekwencja nie zostanie ukończona? Czy ten "stary" identyfikator RowId powinien również być TOŻSAMOŚCI? Po co zastępować kolumnę jedną z tych samych nazw? – gbn

Odpowiedz

38

W SQL Server 2005 lub nowszy, można użyć tego skryptu:

-- drop PK constraint if it exists 
IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.YourTable') AND Name = 'PK_YourTable') 
    ALTER TABLE dbo.YourTable 
    DROP CONSTRAINT PK_YourTable 
GO 

-- drop column if it already exists 
IF EXISTS (SELECT * FROM sys.columns WHERE Name = 'RowId' AND object_id = OBJECT_ID('dbo.YourTable')) 
    ALTER TABLE dbo.YourTable DROP COLUMN RowId 
GO 

-- add new "RowId" column, make it IDENTITY (= auto-incrementing) 
ALTER TABLE dbo.YourTable 
ADD RowId INT IDENTITY(1,1) 
GO 

-- add new primary key constraint on new column 
ALTER TABLE dbo.YourTable 
ADD CONSTRAINT PK_YourTable 
PRIMARY KEY CLUSTERED (RowId) 
GO 

Oczywiście skrypt ten może zakończyć się niepowodzeniem, jeśli inne tabele przedstawieniu tej dbo.YourTable użyciu kluczy obcych na przed- istniejących RowId kolumnę ...

Aktualizacja: i oczywiście, gdziekolwiek używam dbo.YourTable lub PK_YourTable, trzeba wymienić tych zastępczy z rzeczywistych nazw tabeli/więzów z własnej bazy danych (nie wspominając, co byli w swoje pytanie .....)

+0

tabela nie jest refrencing gdziekolwiek, ale nadal nie powiedzie się ... –

+0

Msg 5074, poziom 16, Stan 1, wiersz 4 Obiekt "PK_tempTable" zależy od kolumny "RowId". –

+0

Cóż, a następnie dołączyć 'ALTER TABLE dbo.YourTable DROP CONSTRAINT PK_tempTable' - czy PK jest nazwany czymś innym niż nazwa tabeli ??? Jeśli twoje ograniczenie nie jest nazywane 'PK_TwójTryb', musisz ** odpowiednio dostosować mój skrypt **! –

7

Uwaga: Ta odpowiedź została dodana przed pytaniami aktualizować

  • Dodaj nową kolumnę (uwaga: można mieć tylko jedną kolumnę IDENTITY za stołem)
  • Porzuć stary klucz podstawowy
  • Dodaj nowy klucz podstawowy
  • Opadowej starą kolumnę razie potrzeby

skrypt:

CREATE TABLE whatever (
    OldPKColumn uniqueidentifier NOT NULL, 
    CONSTRAINT PK_whatever PRIMARY KEY (OldPKColumn) 
    ) 

ALTER TABLE whatever 
    ADD RowId int NOT NULL IDENTITY (1,1); 

ALTER TABLE whatever 
    DROP CONSTRAINT PK_whatever; 

ALTER TABLE whatever WITH CHECK 
    ADD CONSTRAINT PK_whatever PRIMARY KEY CLUSTERED (RowId); 

ALTER TABLE whatever 
    DROP COLUMN oldPKcolumn; 

A przypadkowa myśl ... próbujesz zresetować kolumnę tożsamości?
Jeśli tak, a następnie użyć DBCC CHECKIDENT

+7

@SOF Użytkownik: Mam lepszy pomysł. Zadaj lepsze pytanie i nie bądź niegrzeczny. Zmieniłeś pytanie, gdy odpowiadałem, i poprosiłem o wyjaśnienie w komentarzu. – gbn

1

Tylko komentarz do poprawy tych wspaniałych odpowiedzi (nie można jeszcze używać komentarzy - jestem jeden punkt reputacji od tego przywileju), a także w przyszłości dla siebie:

nową tożsamość (AutoNumber) kolumna można dodawać i sprawił, że klucz podstawowy w jednej instrukcji, a także:

ALTER TABLE ADD Cokolwiek rowid int IDENTITY NOT NULL PRIMARY KEY;

Wolę nie zawracać sobie głowy nazwami ograniczeń, gdy to nie pomaga.

Powiązane problemy