Creazione di relazioni tra due tabelle in sql server 2005

lunedì 26 maggio 2008 - 09.43

trinity Profilo | Guru

Salve ragazzi,
sto mettendo in relazione due tabelle di sql server 2005 al fine di rendere + concrete le mie select con le join...

Ecco la struttura delle tabelle:

Archivio_Mov (tabella sui cui eseguo le select)

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Province (tabella da cui devo attingere dei dati tramite join)

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

il mio problema è il seguente, creo la relazione e nel momento in cui vado al salvare il tutto mi esce il seguente messaggio di errore:

Tabella 'province' salvata
Tabella 'Archivio_mov'
- Impossibile creare la relazione 'FK_Archivio_mov_province'.
L'istruzione ALTER TABLE è in conflitto con il vincolo FOREIGN KEY "FK_Archivio_mov_province". Il conflitto si è verificato nella tabella "dbo.province", column 'codprov' del database "c59onlineFR".


Come mai?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>sto mettendo in relazione due tabelle di sql server 2005 al fine
>di rendere + concrete le mie select con le join...

Concrete?

> CONSTRAINT [PK_Archivio_mov_1] PRIMARY KEY CLUSTERED
>(
> [codalbergo] ASC,
> [CodComAlb] ASC,
> [prog_schedina] ASC,
> [annogestionale] ASC,
> [data_elaborazione] ASC
>)

Ella miseria, non ti conviene definire una una colonna ad-hoc (ad es. una colonna IDENTITY) sulla quale definire la PK?
Se ti serve l'univocità su queste colonne puoi definire su di esse un constraint UNIQUE.

>CREATE TABLE [dbo].[province](
> [Id] [int] NULL,
> [codprov] [int] NOT NULL,
> [descprov] [varchar](250) COLLATE Latin1_General_CI_AS NULL,
> [siglaprov] [varchar](2) COLLATE Latin1_General_CI_AS NULL,
> [codistat] [int] NULL,
> [codregione] [int] NULL,
> CONSTRAINT [PK_province_1] PRIMARY KEY CLUSTERED
>(
> [codprov] ASC
>)

Se codprov è la PK, a che ti serve Id?

>il mio problema è il seguente, creo la relazione e nel momento
>in cui vado al salvare il tutto mi esce il seguente messaggio
>di errore:

Quale relazione stai definendo?
Su quale tabella?
Su quali colonne?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

>>sto mettendo in relazione due tabelle di sql server 2005 al fine
>>di rendere + concrete le mie select con le join...
>
>Concrete?

si


>
>> CONSTRAINT [PK_Archivio_mov_1] PRIMARY KEY CLUSTERED
>>(
>> [codalbergo] ASC,
>> [CodComAlb] ASC,
>> [prog_schedina] ASC,
>> [annogestionale] ASC,
>> [data_elaborazione] ASC
>>)
>
>Ella miseria, non ti conviene definire una una colonna ad-hoc
>(ad es. una colonna IDENTITY) sulla quale definire la PK?
>Se ti serve l'univocità su queste colonne puoi definire su di
>esse un constraint UNIQUE.

in che senso?

>
>>CREATE TABLE [dbo].[province](
>> [Id] [int] NULL,
>> [codprov] [int] NOT NULL,
>> [descprov] [varchar](250) COLLATE Latin1_General_CI_AS NULL,
>> [siglaprov] [varchar](2) COLLATE Latin1_General_CI_AS NULL,
>> [codistat] [int] NULL,
>> [codregione] [int] NULL,
>> CONSTRAINT [PK_province_1] PRIMARY KEY CLUSTERED
>>(
>> [codprov] ASC
>>)
>
>Se codprov è la PK, a che ti serve Id?
id non mi serve a nulla appunto lo stavo togliendo ma prima di farlo dovrei modificare del codice anche su vb.


>
>>il mio problema è il seguente, creo la relazione e nel momento
>>in cui vado al salvare il tutto mi esce il seguente messaggio
>>di errore:
>
>Quale relazione stai definendo?
>Su quale tabella?
>Su quali colonne?

mi serve relazionare la tabella archivio_mov con la tabella province, ossia in archivio mov ho una colonna chiamata codcomune essa è il codprov della tabella province.
Devo relazionare questi due campi in modo tale da poter effettuare delle select tra le due tabelle con il join.
Nella tabella province c'è la descrizione che devo prelevare..

ossia ecco un esempio di select:

Select codalbergo Arc, data_elaborazione Arc, nrcomp Arc, codcomune Arc, Desccomune=P.Decprov From Archivio_Mov Arc Join Province P On P.codprov=Arc.codcomune Where Arc.Codalbergo=1


diciamo una cosa del genere

>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>>>sto mettendo in relazione due tabelle di sql server 2005 al fine
>>>di rendere + concrete le mie select con le join...
>>
>>Concrete?
>
>si
E che significa "concrete"?

>>Ella miseria, non ti conviene definire una una colonna ad-hoc
>>(ad es. una colonna IDENTITY) sulla quale definire la PK?
>>Se ti serve l'univocità su queste colonne puoi definire su di
>>esse un constraint UNIQUE.
>
>in che senso?
Aggiungere una colonna IDENTITY alla tabella definendo su di essa un contraint PRIMARY KEY.

>>Se codprov è la PK, a che ti serve Id?
>id non mi serve a nulla appunto lo stavo togliendo ma prima di
>farlo dovrei modificare del codice anche su vb.
OK, modifica il codice poi eliminala.

>>Quale relazione stai definendo?
>>Su quale tabella?
>>Su quali colonne?
>
>mi serve relazionare la tabella archivio_mov con la tabella province,
>ossia in archivio mov ho una colonna chiamata codcomune essa
>è il codprov della tabella province.
OK:

USE tempdb; CREATE TABLE dbo.Archivio_mov( Archivio_mov_ID int NOT NULL IDENTITY PRIMARY KEY, codalbergo int NOT NULL, CodComAlb int NOT NULL, prog_schedina int NOT NULL, annogestionale int NOT NULL, data_elaborazione smalldatetime NOT NULL, stato varchar(1) COLLATE Latin1_General_CI_AS NULL, ncomp int NULL, stato_res varchar(250) COLLATE Latin1_General_CI_AS NULL, codstato int NULL, comune varchar(250) COLLATE Latin1_General_CI_AS NULL, prov varchar(2) COLLATE Latin1_General_CI_AS NULL, codcomune int NULL CONSTRAINT DF_Archivio_mov_codcomune DEFAULT ((0)), codgruppo int NULL ); CREATE TABLE dbo.province( codprov int NOT NULL PRIMARY KEY, descprov varchar(250) COLLATE Latin1_General_CI_AS NULL, siglaprov varchar(2) COLLATE Latin1_General_CI_AS NULL, codistat int NULL, codregione int NULL ); ALTER TABLE dbo.Archivio_mov ADD CONSTRAINT FK_Archivio_mov_Provincie FOREIGN KEY(codcomune) REFERENCES dbo.province(codprov); /* Output: Command(s) completed successfully. */

>Devo relazionare questi due campi in modo tale da poter effettuare
>delle select tra le due tabelle con il join.
Puoi tranquillamente eseguire JOIN SENZA constraint FK!
Un constraint FK serve solo per evitare di inserire nella tabella molti dei valori inconsistenti con quelli della tabella 1 e per evitare di elimare delle righe dalla tabella 1 che hanno righe "figlie" nella tabella molti.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Grazie per l'info.
ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
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