2013-02-01 22 views
24

Ho una colonna in db che ha 5 colonne ma nessuna chiave primaria. Una delle colonne è denominata myTable_id ed è integer.Imposta la colonna come chiave primaria se la tabella non ha una chiave primaria

Voglio verificare se la tabella ha una colonna chiave primaria. In caso contrario, crea myTable_id come colonna della chiave primaria e rendi la colonna Identity. C'è un modo per fare questo?

ho provato con questo:

ALTER TABLE Persons 
DROP CONSTRAINT pk_PersonID 

ALTER TABLE Persons 
ADD PRIMARY KEY (P_Id) 

ed ottengo errore di sintassi in studio di gestione.

+3

è necessario contrassegnare una risposta come accettata. –

risposta

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

come si parla della colonna Identity? –

+0

"Voglio controllare se la tabella ha una colonna chiave primaria" non è stata indirizzata. – Monkey

43

Questo controlla se la chiave primaria esiste, se non si è creato

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 

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

0

non credo che si può fare. Per creare una colonna in una colonna Identity, penso che devi abbandonare completamente la tabella.

+1

Non è possibile convertire in identità ma è possibile aggiungere un'identità a una tabella – Paparazzi

2

È possibile verificare se la chiave primaria esiste o non utilizza OBJECTPROPERTY Transact SQL, utilizzare 'TableHasPrimaryKey' per i secondi argomenti.

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

Penso che @ISHASPRIMARYKEY sarà null solo se la tabella Persone non esiste, altrimenti sarà 0 o 1 a seconda dell'esistenza di una chiave primaria . – KnarfaLingus

+0

@KnarfaLingus - hai ragione. Ho effettuato una modifica ma il mio rappresentante non è abbastanza alto in questo momento, quindi devo aspettare che venga approvato. –

2

Un IDENTITY vincolo non possono essere aggiunti a una colonna esistente, così come aggiungere questo deve essere il vostro pensiero iniziale. Ci sono due opzioni:

  1. creare una nuova tabella tra cui una chiave primaria con l'identità e eliminare la tabella esistente
  2. Creare una nuova colonna di chiave primaria con l'identità e eliminare la colonna esistente 'P_ID'

C'è un terzo modo, che è un approccio migliore per tabelle molto grandi tramite l'istruzione ALTER TABLE...SWITCH. Vedere Adding an IDENTITY to an existing column per un esempio di ciascuno. In risposta a questa domanda, se la tabella non è troppo grande, vi consiglio eseguendo i seguenti:

-- 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 

Note: esplicitamente utilizzando la parola chiave CONSTRAINT il vincolo di chiave primaria viene dato un nome particolare, piuttosto che in base a SQL Server per l'assegnazione automatica di un nome.

Includere solo CLUSTERED su PRIMARY KEY se il saldo delle ricerche di un P_ID specifico e la quantità di scrittura superano i vantaggi del clustering della tabella con un altro indice. Vedi Create SQL IDENTITY as PRIMARY KEY.

Problemi correlati