Relazione tra tabelle

giovedì 31 gennaio 2008 - 17.12

santa Profilo | Newbie

ciao
oggi vi stresso un pò scusate

ho provato a cercare un pò in giro ma non ne sono venuto a capo

so che sicuramente è una cosa banale ma.....

ho due tabelle una prodotto e una articolo

ho fatto una relazione tra loro

il prodotto può essere composto da 4 articoli

se inserisco un nuovo prodotto e inserisco tutte 4 gli articoli, non ci sono problemi, se per caso ne inserisco solo tre mi dà errore di

l'istruzione insert è in conflitto con il vincolo foreign key (fk_prodotto_cartainterna"
il conflitto si è verificato nella tabella "articoli", column "idarticoli del database ...

devo settare qualcosa nella relazione o nelle tabelle


spero di essermi spiegato

ciao e buona serata

ilario

alx_81 Profilo | Guru

>ciao
Ciao!

>devo settare qualcosa nella relazione o nelle tabelle
>spero di essermi spiegato
Postaci gli script di CREATE TABLE, quelli della relazione ed alcune insert, di modo che possiamo controllare l'errore meglio.
Grazie

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

santa Profilo | Newbie

ti inserisco il create table (che mi ha fatto server menagement)

è una tebella di stampe ( dove viene inserito come deve essere fatta e chiusa una determinata stampa) ed è collegata con altre tabelle tipo articoli, chiusure, carattere eccc..

se solo uno di questi manca mi dà errore, in alcuni magari sono obbligatori e quindi prima di inserire posso anche controllare se i campi sono pieni, ma in altri possono esserci o no,
tipo la carta esterna o quella interna che non sono obbligatori entrambi contemporaneamente

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




alx_81 Profilo | Guru

>ti inserisco il create table (che mi ha fatto server menagement)
Scusami, forse non mi sono spiegato bene. Mi servono le CREATE TABLE delle tue due tabelle. Quelle che nel primo post indichi come Articoli e Prodotti.
Quindi, CREATE TABLE della tabella Articoli, quello della Prodotti e poi lo script della FOREIGN KEY che definisce la relazione tra le due.
Altrimenti così non riesco proprio ad esserti di aiuto.
Probabilmente è un semplice errore logico nella definizione della relazione, ma non posso giungere a conclusioni affrettate senza avere la tua situazione reale sotto mano. Magari, indicami anche le INSERT che vanno in conflitto così vediamo di capire per bene dove sta l'incongruenza.
Ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

santa Profilo | Newbie



questa è quella dell'articolo

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


l'altra tabella (righe stampe) è quella che ti ho inserto prima , nel primo post ho detto prodotti per semplificare un pò , se vedi nelle colonne sono presenti cartainterna e cartaesterna sono alla fine collegati alla tabella articoli


la sql che uso per inserire è

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


dove dbdati.controllaindex è una funzione che mi restituisce la stringa con la doppia '

non so se posso ma se ti serve ti allego l'intero db

grazie
ilario

alx_81 Profilo | Guru

>questa è quella dell'articolo
A cosa ti serve la seguente Foreign Key?

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

Questa relazione, di un campo della tabella articoli con lo stesso campo della stessa tabella, non capisco a cosa possa servire .
A prescindere da questo la relazione è una uno-a-molti (o meglio sono due uno-a-molti, sempre sull'idarticoli prima con l'idcartainterna e poi con l'idcartaesterna). Ciò significa che fino a che non inserisci la parte uno non puoi inserire la parte molti. Di conseguenza, nel tuo caso, devi prima inserire tutti gli Articoli che ti servono e solo dopo le RigheStampe. Il fatto che i prodotti siano 3 o 4 è ininfluente, l'errore lo ottieni perchè cerchi di inserire nella righe stampe un articolo che ancora non esiste. Cosa impossibile se esiste un vincolo di integrità (quello espresso dalla relazione, la Foreign Key).
Controlla con attenzione e noterai che nell'inserimento che ti ritorna l'errore cerchi di inserire un IDCartaEsterna o un IDCartaInterna (o entrambi) ancora non esistenti nella tabella Articoli. Nel tuo caso, leggendo il testo dell'errore, sicuramente un idcartaesterna non esiste .

>grazie
di nulla!

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

santa Profilo | Newbie

>>questa è quella dell'articolo
>A cosa ti serve la seguente Foreign Key?

questa a niente quando con menagement inserisci una nuova relazione ti inserisce tabella su tabella poi la cambio, quella la devo aver inserita e poi non cambiata

>A prescindere da questo la relazione è una uno-a-molti (o meglio
>sono due uno-a-molti, sempre sull'idarticoli prima con l'idcartainterna
>e poi con l'idcartaesterna). Ciò significa che fino a che non
>inserisci la parte uno non puoi inserire la parte molti. Di conseguenza,
>nel tuo caso, devi prima inserire tutti gli Articoli che ti servono
>e solo dopo le RigheStampe. Il fatto che i prodotti siano 3 o
>4 è ininfluente, l'errore lo ottieni perchè cerchi di inserire
>nella righe stampe un articolo che ancora non esiste. Cosa impossibile
>se esiste un vincolo di integrità (quello espresso dalla relazione,
>la Foreign Key).

allora ho sbagliato completamente la relazione

ma come faccio a farla , deve essere esattamente al contrario a questo punto

nella tabella righestampe devo poter inserire uno o più articoli, ovviamente sono già presenti nel db (tabella articoli),

>Controlla con attenzione e noterai che nell'inserimento che ti
>ritorna l'errore cerchi di inserire un IDCartaEsterna o un IDCartaInterna
>(o entrambi) ancora non esistenti nella tabella Articoli. Nel
>tuo caso, leggendo il testo dell'errore, sicuramente un idcartaesterna
>non esiste .

un idcartaesterna non esiste perchè non lo devo inserire per forza,
sembra che se faccio la relazione tra le due tabelle devo per forza inserire l'articolo,
a me serve questa relazione solo per controllare che se un id articolo è inserito nella tabella righestampe, non può essere cancellato,


ciao


ilario

alx_81 Profilo | Guru

>questa a niente quando con menagement inserisci una nuova relazione
>ti inserisce tabella su tabella poi la cambio, quella la devo
>aver inserita e poi non cambiata
immaginavo fosse un errore

>allora ho sbagliato completamente la relazione
>ma come faccio a farla , deve essere esattamente al contrario
>a questo punto
>nella tabella righestampe devo poter inserire uno o più articoli,
>ovviamente sono già presenti nel db (tabella articoli),
Se vuoi inserire uno o più artcoli nella RigheStampe la relazione è corretta, un articolo nella Articoli n articoli nella RigheStampe (ed è su IDCartaEsterna e su IDCartaInterna). Ma dall'errore che ottieni stai cercando di inserire un articolo che ancora non esiste (Ad esempio un valore di default come -1?)

>un idcartaesterna non esiste perchè non lo devo inserire per forza,
>sembra che se faccio la relazione tra le due tabelle devo per
>forza inserire l'articolo,
Se lasci NULL nel campo idcartaesterna non hai eccezioni e quindi puoi decidere di non inserirlo, quindi non sei costretto a valorizzare per forza l'id. Probabilmente nella insert generi un valore di default che non hai previsto nella Articoli.
Ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

santa Profilo | Newbie

ho crontrollato nella tabella è possibile inserire un valore null

e ti scrivo di seguito la stringa sql che mi esce facendo una prova

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

come puoi vedere non inserisce nessun valore dopo 1 1 che sono il tipo stampa e il modello, ci sono solo ''

non capisco proprio

ti inserisco anche due immagine della form di inserimento righestampe per capire meglio


640x522 36Kb


640x619 41Kb


grazie per la pazienza
,

ps. mi ero dimenticato di dirti che la stessa cosa mi succede con le altre tabelle relazionate tipo chiusura o ceralacca ec...
se inserisco i due tipi di carta e non inserisco la chiusura, mi da errore sulla chiusura e così via

praticamente non mi accetta il valore '' null

ciao

alx_81 Profilo | Guru

>ho crontrollato nella tabella è possibile inserire un valore
>null>
>e ti scrivo di seguito la stringa sql che mi esce facendo una
>prova
>
>come puoi vedere non inserisce nessun valore dopo 1 1 che sono
>il tipo stampa e il modello, ci sono solo ''
C'è un problema di concetto. '' non è assolutamente NULL. NULL è NULL e basta .
'' significa VUOTO, quindi sai che il valore è VUOTO.
NULL significa NON LO SO ed è un valore ignoto.
Se vuoi inserire null, non devi mettere ''. Hai due possibilità, o metti NULL al posto di '', oppure ometti il campo nell'inserimento.
Ma ricorda che '' non è NULL, è BLANK.

>grazie per la pazienza
figurati

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

santa Profilo | Newbie

grazie consideravo vuoto = null

ho solo un problema che mi dice che null sul campo int non va bene

l'altra soluzione : come faccio a crearmi una stringa inserendo il campo quando c'è e non inserirlo quando è vuoto
dovrei prima controllare tutti i campi e costruirmi la stringa sql in modo dinamico

mi sembra un pò complicato

a questo punto mi conviene non metterle in relazione e se voglio cancellare un articolo, prima con una seplice sql controllo se è presente nella tabella righestampe

ciao
ilario


alx_81 Profilo | Guru

>grazie consideravo vuoto = null

>
>ho solo un problema che mi dice che null sul campo int non va bene
come inserisci il null? com'è la insert? perchè in tutti i tipi di campo puoi inserire NULL, ma non usare apici, altrimenti è una stringa con il valore NULL, devi scrivere solo NULL.
>
>l'altra soluzione : come faccio a crearmi una stringa inserendo
>il campo quando c'è e non inserirlo quando è vuoto
>dovrei prima controllare tutti i campi e costruirmi la stringa
>sql in modo dinamico
>mi sembra un pò complicato
Infatti di solito è buona norma non comporre le istruzioni SQL dinamicamente da codice, anche per non incappare nel SQL Injection, così amato dai famosi malintenzionati. Per garantire un buon livello di sicurezza, scrivi delle stored procedure in SQL Server e poi chiama quelle.
>
>a questo punto mi conviene non metterle in relazione e se voglio
>cancellare un articolo, prima con una seplice sql controllo se
>è presente nella tabella righestampe
mmmmh.. no.. meglio la relazione.
>
>ciao
>ilario
>
>
>

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

santa Profilo | Newbie

ciao

ti stavo rispondendo proprio adesso

come al solito è sempre un errore banale

nella sql dove andavo a insere Null veniva inserito con gli apici

adesso dopo diversi tentativi ne sono venuto a capo


ti ringrazio tantissimo per l'aiuto

ciao
ilario

santa Profilo | Newbie

> Per garantire un buon
>livello di sicurezza, scrivi delle stored procedure in SQL Server
>e poi chiama quelle.


per il momento non li avevo scritte dopo tutto quello che ho letto oggi

inizierò a rifare un po il tutto

grazie ancora

ciao
ilario

alx_81 Profilo | Guru

>grazie ancora
di nulla!
se ritieni che le risposte siano state state esaurienti, chiudi il post accettando la risposta.
grazie, ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
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