21. oktober 2009 - 12:51Der er
4 kommentarer og 1 løsning
Null-værdi i fremmednøgle
Hejsa Jeg har følglende scenarie: To tabeller a) Payement --------- PaymentID - PRIMÆRNØGLE Description . . F_PostalCode - FREMMEDNØGLE til posttabel F_F_CountryID - FREMMEDNØGLE til posttabel -------------------------------------------
b) PostalCodes ------------ PostalCode (f.eks. 2100) - PRIMÆRNØGLE City (f.eks. Østerbro) CountryID (f.eks. 1 - danmark) - PRIMÆRNØGLE ---------------------------------------------
Min tanke er så at der i Payment-tabellen kan forekomme scenarier hvor der ikke er nogen adresse, dvs. ingen reference til posttabellen. Medens der kan forekommer adresser, dvs. der ønskes referentiel integritet mellem Payment og PostalCodes.
Det er lykkedes mig at oprette de to fremmednøgler som tillader null.
Meeen - og her kommer kernen i mit problem - når jeg opretter et ugyldigt postnummer i payment-tabellen, tillades postnummeret (det ønskes ikke - her ønskes en fejl). Hvis jeg ikke tillader null-værdier får jeg ingen fejl.
Spørgsmål: Det jeg vil - tillade null og hvis der ikke er null lave referentirel integritet - kan det lade sig gøre? Er det en dum måde at lave DB-design på?
Ja, jeg mener at det er din tabel struktur du skal tilpasse. Siden en payment kan eksistere uden adresse saa skal din Payment-tabel kun indeholde felterne paymentid og description. I en saerskilt PaymentAddress tabel har du saa paymentaddressid, paymentid, postcode, countryid. I PaymentAddress tabellen er paymentid fremmednoegle til Payment tabellen og postcode og countryid er fremmednoegler til postalcode tabellen. (Du kunne saa gaa videre og lave en country tabel med countryid og country og saa i paymentaddress tabellen erstatte countryid med country. Saa behoever folk ikke at huske countryid, og ved at goere country fremmednoegle til country tabellen bevares den referentiele integritet.
Hvis du har oprettet en FK og tilladt NULLS så vil den da fejle hvis du prøver at oprette noget som ikke er NULL og som ikke findes i PK-tabellen. Det forstår jeg ikke hvorfor du ikke kan få til at virke, det er skam et helt almindeligt db-design.
well nu har jeg fjernet det gamle design. Christian_Belgien overbeviste mig om at jeg havde lavet et dårligt design, som nu er lavet om ;).
Men efter hukommelsen var det noget i den stil jeg havde lavet følgende tabel, der havde reference til en post-tabel med Postalcode og CountryID: CREATE TABLE PaymentOnline ( PaymentOnlineID SMALLINT IDENTITY NOT NULL PRIMARY KEY , GUID VARCHAR(50) NOT NULL , F_ActivityID INT NOT NULL REFERENCES Activities(ActivityID)
Hvis jeg i ovenstående tabel skrev en forkert PostalCode lykkedes det uden problemer (måske skyldes det - men det er kun et gæt - at jeg kun udfyldet den ene primærnøgle[PostalCode] og ikke begge [+CountryID])
Ahh ja, din FK er sammensat. Det kan du løse ved at lave en særskilt FK constraint på hhv. PostalCode og CountryId.
Men udover det har Christian jo ret mht. normaliseringen.. Boyce Codd ;) The key, the whole key and nothing but the key :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.