>Ho una tabella con la chiave primaria costituita da due campi.
>Ho bsogno di fare una alter table che mi aggiunga un terzo campo
>il quale deve fare parte anch'esso della chiave primaria. Io
>ho provato in diversi modi ma continua a non accettarmi la sintassi:
>
>es.
>
>ALTER TABLE ESTRAZIONI
>add DATACRE datetime
>
>ALTER TABLE ESTRAZIONI
>ADD CONSTRAINT PK_DATACRE
>PRIMARY KEY (DATACRE)
>
>errore:
>Messaggio 1779, livello 16, stato 0, riga 4
>È già stata definita una chiave primaria per la tabella 'ESTRAZIONI'.
>Messaggio 1750, livello 16, stato 0, riga 4
>Impossibile creare il vincolo. Vedere gli errori precedenti.
Ciao Marco,
Il discorso è un pelino più complesso.
Come saprai una tabella può avere al più 1 solo constraint di PRIMARY KEY quindi non puoi aggiungerne un altro come nel tuo esempio.
Un constraint PRIMARY KEY necessita che tutte le colonne coinvolte non accettino il valore NULL.
Quando aggiungi una colonna ad una tabella già popolata sei costretto a definirla in modo che accetti il valore NULL, a meno di definire su di essa un constraint di DEFAULT.
Supponendo che tu non voglia questo, ti riporto uno script con tutti i passi necessari.
USE tempdb;
CREATE TABLE dbo.Foo(
Col1 int NOT NULL,
Col2 int NOT NULL,
CONSTRAINT PK_Foo PRIMARY KEY(Col1, Col2)
);
INSERT dbo.Foo VALUES(1, 2), (3, 4);
/* Aggiungo la nuova colonna */
ALTER TABLE dbo.Foo
ADD Col3 int NULL;
/* Assegno un valore alla nuova colonna */
UPDATE dbo.Foo
SET Col3 = 9;
/* Modifico la nullability della nuova colonna */
ALTER TABLE dbo.Foo
ALTER COLUMN Col3 int NOT NULL;
/* Elimino la vecchia PK */
ALTER TABLE dbo.Foo
DROP CONSTRAINT PK_Foo;
/* Ricreo la nuova PK */
ALTER TABLE dbo.Foo
ADD CONSTRAINT PK_Foo PRIMARY KEY(Col1, Col2, Col3);
/* Pulizia */
DROP TABLE dbo.Foo;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org