Help me!!!!!! Sql Server 2008 e Foreing Key

domenica 17 gennaio 2010 - 17.56

ficcanaso Profilo | Newbie

Salve a tutti,
sono un neofita di SQL SERVER ed ho appena installato ed intrapreso la strada dello sviuppatore su sql server 2008 express.
Ho creato 2 tabelle (utilizzando il designer del management studio) in questo modo:

Tabella1
ID
nome PK

Tabella2
ID
nomi FK

Ho collegato le tabelle da una foreing key settata per fare sia l'insert che l'update in cascata.

Mi succede questo:
se inserisco dati dal management studio nella prima tabella nella seconda non viene aggiunto nulla.
Stessa cosa mi capita per l'eliminazione: se manualmente inserisco sia nella prima che nella seconda campi congrui, ovvero

Tabella1
1 Giulio
2 Mirco

Tabella2
1 Mirco
2 Mirco
3 Giulio

e cancello Giulio nella prima tabella, la seconda resta con i dati..... non dovrebbe farlo in automatico??? oppure devo inserire i dati per forza da istruzioni sql?

Aiuto

Marco

lbenaglia Profilo | Guru

>Ho creato 2 tabelle (utilizzando il designer del management studio)
>in questo modo:
>
>Tabella1
>ID
>nome PK
>
>Tabella2
>ID
>nomi FK

Ciao Marco,

Non capisco bene la struttura delle tabelle.
A cosa serve la colonna ID di Tabella 1 se il constraint di Primary Key è definito sulla colonna nome?
Nella Tabella 2 dov'è la Primary Key?

>Ho collegato le tabelle da una foreing key settata per fare sia
>l'insert che l'update in cascata.
L'"insert a cascata" non esiste. L'opzione cascade su un constraint Foreign Key può essere solo di UPDATE o DELETE.

>Mi succede questo:
>se inserisco dati dal management studio nella prima tabella nella
>seconda non viene aggiunto nulla.
>Stessa cosa mi capita per l'eliminazione: se manualmente inserisco
>sia nella prima che nella seconda campi congrui, ovvero
>
>Tabella1
>1 Giulio
>2 Mirco
>
>Tabella2
>1 Mirco
>2 Mirco
>3 Giulio
>
>e cancello Giulio nella prima tabella, la seconda resta con i
>dati..... non dovrebbe farlo in automatico??? oppure devo inserire
>i dati per forza da istruzioni sql?

Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.T1( Nome varchar(10) NOT NULL, CONSTRAINT PK_T1 PRIMARY KEY(Nome) ); CREATE TABLE dbo.T2( ID int NOT NULL, Nome varchar(10) NOT NULL, CONSTRAINT PK_T2 PRIMARY KEY(ID), CONSTRAINT FK_T2_T1 FOREIGN KEY(Nome) REFERENCES dbo.T1(Nome) ON DELETE CASCADE ); INSERT dbo.T1 VALUES ('Giulio') , ('Mirco'); INSERT dbo.T2 VALUES (1, 'Mirco') , (2, 'Mirco') , (3, 'Giulio'); DELETE dbo.T1 WHERE Nome = 'Giulio'; SELECT * FROM dbo.T2; /* Output: ID Nome ----------- ---------- 1 Mirco 2 Mirco (2 row(s) affected) */ DROP TABLE dbo.T2, dbo.T1;

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

ficcanaso Profilo | Newbie

Allora,
grazie mille per la fulminea risposta!!!
L'id della prima tabella è un contatore, mentre l'id della seconda è la PK.

Hai ragione, è update and delete.... ma non dovrebbe funzionare come la relazione di access?? ovvero inserisco 1 dato all'interno di una tabella padre e lui lo propaga automaticamente al figlio(comprese delete ed update)? (con la clausola 1 a molti)

Marco

lbenaglia Profilo | Guru

>L'id della prima tabella è un contatore, mentre l'id della seconda
>è la PK.
E a che ti serve "il contatore" nella prima tabella?

>Hai ragione, è update and delete.... ma non dovrebbe funzionare
>come la relazione di access??
>ovvero inserisco 1 dato all'interno
>di una tabella padre e lui lo propaga automaticamente al figlio
Non ricordo come ragiona Jet, ma sei sicuro che sia proprio così?!
Tu inserisci una riga nella tabella dalla parte 1 della relationship ed *automaticamente* viene inserita una riga nella tabella dalla parte molti?!
A me sembra un comportamento assurdo

>(comprese delete ed update)? (con la clausola 1 a molti)
Queste funzionano come ti ho dimostrato, basta specificare le opzioni ON DELETE CASCADE e ON UPDATE CASCADE.

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

ficcanaso Profilo | Newbie

Bhè,
assurdo non direi: se con access hai

tabella1 tabella2
nome nomi

collegati 1 a molti, tutti i nomi che inserirai all'interno di tabella1.nome automaticamente verranno scritti su tabella2.nomi.
Inoltre, vorrei farti una domanda riguardo update e delete:

come mai nel riquadro di selezione è indicato INSERT AND UPDATE???? Ti allego l'immagine

Ultima cosa: come faccio a gestire a questo punto tabelle collegate di sql server utilizzando come front end access??? qualche idea???
Grazie Mille

Marco


566x365 23Kb

lbenaglia Profilo | Guru

>Bhè,
>assurdo non direi: se con access hai
>
>tabella1 tabella2
>nome nomi
>
>collegati 1 a molti, tutti i nomi che inserirai all'interno di
>tabella1.nome automaticamente verranno scritti su tabella2.nomi.
Ribadisco, a me pare un comportamento assurdo

>Inoltre, vorrei farti una domanda riguardo update e delete:
>
>come mai nel riquadro di selezione è indicato INSERT AND UPDATE????
>Ti allego l'immagine
Boh, non uso editor grafici per definire le relationship ma vado sempre di T-SQL.

>Ultima cosa: come faccio a gestire a questo punto tabelle collegate
>di sql server utilizzando come front end access??? qualche idea???
Se cerchi un IDE puoi ricorrere a SQL Server Management Studio, oppure qualunque client in grado di sottomettere comandi T-SQL all'istanza SQL Server (come sqlcmd.exe).

>Grazie Mille
Prego.

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

Jeremy Profilo | Guru

Ciao.
Guarda bene l'immagine che hai inviato ....
C'è si, scritto INSERT ed UPDATE, ma nei sottonodi, in realtà puoi specificare solo le azioni di aggiornamento ed eliminazione.
Ciao.

ficcanaso Profilo | Newbie

Si, questo lo avevo notato...
In effetti non contestavo le giuste considerazioni di LBenaglia, ma spiegavo solo che la mia indicazione del post precedente era riferita solo alla voce padre del nodo e non alle sue possibili opzioni.

Ciao

Marco
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5