Alter table su tabella a chiave multipla

venerdì 13 febbraio 2009 - 12.37

dipy Profilo | Junior Member

Scusate la probabile banalità della mia domanda ma purtroppo non ho trovato nulla di soddisfacente in giro per il web.

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.

lbenaglia Profilo | Guru

>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
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5