2 messaggi dal 09 febbraio 2010
ciao a tutti,
mi sapete dire quale è il codice SQL per rendere una chiave esterna anche chiave primaria?

Vi faccio un esempio io ho due entità ed un'associazione del tipo

E1: PERSONA con chiave primaria codiceFiscale

A: puòEssere

E2: FEMMINA con chiave esterna PERSONA.codiceFiscale

(ora indipendentemente dal fatto che possa essere più o meno giusto a volte è necessario fare una cosa del genere) questo tipo di modello E/R si traduce in 2 tabelle: PERSONA e FEMMINA.

In questo caso la chiave esterna PERSONA.codiceFiscale della tabella FEMMINA può essere anche chiave primaria perchè il codice fiscale è univoco per ogni persona, però ogni occorrenza della tabella FEMMINA deve corrispondere a un'occorrenza della tabella PERSONA.

Come faccio a combinare le due cose?

Se rendo chiave esterna PERSONA.codiceFiscale mi permette di inserire più entry con lo stesso codice fiscale nella tabella FEMMINA, se invece la metto come chiave primaria posso inserire una entry in FEMMINA anche se non ce n'è una corrispondente in PERSONA, se aggiungo il vincolo uinque key perde la proprietà di chiave esterna... Come faccio?

E un'altra cosa: come rendo chiave primaria la combinazione di due campi? Cioè quando due campi insieme mi creano una chiave primaria. Quale è il codice?

Io sto utilizzando MySQL
salve,

che la tua entita' possa essere di "tipo femmina", questo e' indubbio, ma a mio parere non richiede la definizione di un'altra tabella.. "femmina" sara' eventualmente un attributo della tabella persona, anzi, l'attributo sara' piu' probabilmente il tipo di "sesso", in tutte le sue estensioni.. non ho qui sotto mano lo standard ANSI per i relativi codici, ma non ricordo fossero "solo 2" :)

quindi non riesco ben a comprendere la tua modellazione..
potrei capire un tipo di modellazione tipo "super type", dove hai un'entita' "astratta" base che poi venga estesa negli attributi da tabelle addizionali, ma non quello che mi pare di aver capito dalle tue indicazioni..

al di la' di cio', e' ovviamente possibile definire una chiave esterna anche come chiave primaria della tabella referenziante, cosa che giocoforza comporta anche un vincolo di univocita' sul relativo attributo, e sostanzialmente un tipo di relazione 1 a 1..

in Transact-SQL (SQL Server), puoi raggiungere il risultato come di seguito..

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.mster (
Id int NOT NULL PRIMARY KEY,
Data varchar(10)
);
CREATE TABLE dbo.detail (
Id int NOT NULL,
Data varchar(10)
);

ALTER TABLE dbo.detail
ADD CONSTRAINT pk_detail
PRIMARY KEY (Id);

ALTER TABLE dbo.detail
ADD CONSTRAINT fk_detail$is$mster
FOREIGN KEY (Id)
REFERENCES dbo.mster(Id);
GO
DROP TABLE dbo.detail, dbo.mster;

la sintassi ALTER TABLE ADD CONSTRAINT e' relativamente standardizzata quindi dovresti poterla facilmente riscontrare anche nei dialetti utilizzati da MySQL..

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
http://www.hotelsole.com - http://www.hotelsolericcione.de
Andrea Montanari ha scritto:
.. non ho qui sotto mano lo standard ANSI per i relativi codici, ma non ricordo fossero "solo 2" :)


trovato: http://www.java2s.com/Code/XML/XML-Schema/GendercodebasedonxsnonNegativeInteger.htm , al quale ovviamente si aggiunge anche NULL, che sara' poi da identificare in una delle sue 15 e passa accezioni.. probabilmente il "non applicabile" dovrebbe essere quello di maggior conforto :)
saluti

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
http://www.hotelsole.com - http://www.hotelsolericcione.de

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
In primo piano

I più letti di oggi

Media
In evidenza
MISC