2013-02-01 12 views
24

Mam kolumnę w bazie danych, która ma 5 kolumn, ale bez klucza podstawowego. Jedna z kolumn ma nazwę myTable_id i jest liczbą całkowitą.Ustaw kolumnę jako klucz podstawowy, jeśli tabela nie ma klucza podstawowego

Chcę sprawdzić, czy tabela ma kolumnę klucza podstawowego. Jeśli tak się nie stanie, zmień wartość myTable_id na kolumnę klucza głównego i ustaw ją jako kolumnę tożsamości. Czy jest jakiś sposób na zrobienie tego?

Próbowałem z tym:

ALTER TABLE Persons 
DROP CONSTRAINT pk_PersonID 

ALTER TABLE Persons 
ADD PRIMARY KEY (P_Id) 

i otrzymuję błąd składni w studio Zarządzania.

+3

należy oznaczyć jedną odpowiedź jako zaakceptowaną. –

Odpowiedz

9
ALTER TABLE Persons 
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
+1

Co powiesz na kolumnę tożsamości? –

+0

"Nie sprawdziłem, czy tabela ma kolumnę klucza głównego". – Monkey

43

ten sprawdza, czy istnieje klucz podstawowy, jeśli nie jest on tworzony

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'Persons' 
AND TABLE_SCHEMA ='dbo') 
BEGIN 
    ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
END 
ELSE 
BEGIN 
    -- Key exists 
END 

skrzypce: http://sqlfiddle.com/#!6/e165d/2

0

I nie sądzę, że można to zrobić. Aby utworzyć kolumnę w kolumnie identyfikacyjnej, myślę, że musisz całkowicie usunąć tabelę.

+1

Nie można przekonwertować na tożsamość, ale można dodać tożsamość do tabeli – Paparazzi

2

Możesz sprawdzić, czy klucz podstawowy istnieje, czy nie, używając OBJECTPROPERTY Transact SQL, użyj 'TableHasPrimaryKey' dla drugich argumentów.

DECLARE @ISHASPRIMARYKEY INT; 

SELECT @ISHASPRIMARYKEY = OBJECTPROPERTY(OBJECT_ID('PERSONS'), 'TABLEHASPRIMARYKEY'); 
IF @ISHASPRIMARYKEY IS NULL 
BEGIN 
    -- generate identity column 
    ALTER TABLE PERSONS 
    DROP COLUMN P_ID; 

    ALTER TABLE PERSONS 
    ADD P_ID INT IDENTITY(1,1); 

    -- add primary key 
    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_PERSONID PRIMARY KEY (P_ID); 

END; 
+1

Myślę, że @ISHASPRIMARYKEY będzie miało wartość null, jeśli tabela Persons nie istnieje, w przeciwnym razie będzie to 0 lub 1 w zależności od istnienia klucza podstawowego . – KnarfaLingus

+0

@KnarfaLingus - masz rację. Zrobiłem edycję, ale mój przedstawiciel nie jest wystarczająco wysoki, więc muszę poczekać na zatwierdzenie. –

2

IDENTITY ograniczenie nie mogą być dodawane do istniejącej kolumny, tak jak dodasz to musi być twoja początkowa myśl. Istnieją dwie opcje:

  1. Utwórz nową tabelę zawierającą klucz podstawowy z tożsamością i upuść istniejącej tabeli
  2. Utwórz nowy klucz podstawowy kolumny tożsamości i upuść istniejącej kolumny „p_id”

Istnieje trzecia droga, która jest lepszym podejściem do bardzo dużych tabel za pośrednictwem oświadczenia ALTER TABLE...SWITCH. Zobacz Adding an IDENTITY to an existing column dla każdego z nich. W odpowiedzi na to pytanie, jeśli tabela nie jest zbyt duży, polecam uruchamiając następujące:

-- Check that the table/column exist and no primary key is already on the table. 
IF COL_LENGTH('PERSONS','P_ID') IS NOT NULL 
    AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'PERSONS') 
        -- Add table schema to the WHERE clause above e.g. AND TABLE_SCHEMA ='dbo' 
BEGIN 
    ALTER TABLE PERSONS  
    ADD P_ID_new int IDENTITY(1, 1) 
    GO 

    ALTER TABLE PERSONS 
    DROP COLUMN P_ID 
    GO 

    EXEC sp_rename 'PERSONS.P_ID_new', 'P_ID', 'Column' 
    GO 

    ALTER TABLE PERSONS 
    ADD CONSTRAINT PK_P_ID PRIMARY KEY CLUSTERED (P_ID) 
    GO 
END 

Uwagi: jawnie za pomocą słowa kluczowego CONSTRAINT klucz podstawowy ograniczenia podano konkretnej nazwy zamiast w zależności od SQL Server, aby automatycznie przypisać nazwę.

Dołączać tylko CLUSTERED na PRIMARY KEY, jeśli saldo wyszukiwania określonego P_ID i ilość zapisu przewyższają korzyści wynikające z grupowania tabeli przez jakiś inny indeks. Zobacz Create SQL IDENTITY as PRIMARY KEY.

Powiązane problemy