Avatar billede anders_cp Nybegynder
29. september 2009 - 17:37 Der er 16 kommentarer og
1 løsning

Reference til sammensat primærnøgle

Hejsa
Hvordan - hvis det kan lade sig gøre - laver jeg en reference til en sammensat primærnøgle?

PARTS
-----
PartVendorID(PK,smallint, not null)
PartNumber(PK, VARCHAR(50), not null)
partname
.
.
.


Jeg har prøve forskelligt, men her er en af de ting jeg har prøvet:
CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY
   
    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
    , F_PartNumber VARCHAR(50) NOT NULL
   
    FOREIGN KEY(F_PartVendorID, F_PartNumber)
        REFERENCES Parts(PartVendorID, PartNumber)
       
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
)

Jeg får fejlen:
Msg 8140, Level 16, State 0, Line 1
More than one key specified in column level FOREIGN KEY constraint, table 'PartnerDiscount'.
Avatar billede arne_v Ekspert
29. september 2009 - 17:42 #1
proev:

CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY
 
    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
    , F_PartNumber VARCHAR(50) NOT NULL
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
 
    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID, F_PartNumber)
        REFERENCES Parts(PartVendorID, PartNumber)
     
)
Avatar billede arne_v Ekspert
29. september 2009 - 17:42 #2
proev:

CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY
 
    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
    , F_PartNumber VARCHAR(50) NOT NULL
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
 
    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID, F_PartNumber)
        REFERENCES Parts(PartVendorID, PartNumber)
     
)
Avatar billede arne_v Ekspert
29. september 2009 - 17:42 #3
proev:

CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY
 
    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
    , F_PartNumber VARCHAR(50) NOT NULL
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
 
    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID, F_PartNumber)
        REFERENCES Parts(PartVendorID, PartNumber)
     
)
Avatar billede arne_v Ekspert
29. september 2009 - 17:42 #4
proev:

CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY
 
    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
    , F_PartNumber VARCHAR(50) NOT NULL
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
 
    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID, F_PartNumber)
        REFERENCES Parts(PartVendorID, PartNumber)
     
)
Avatar billede arne_v Ekspert
29. september 2009 - 17:42 #5
proev:

CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY
 
    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
    , F_PartNumber VARCHAR(50) NOT NULL
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
 
    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID, F_PartNumber)
        REFERENCES Parts(PartVendorID, PartNumber)
     
)
Avatar billede arne_v Ekspert
29. september 2009 - 17:42 #6
proev:

CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY
 
    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
    , F_PartNumber VARCHAR(50) NOT NULL
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
 
    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID, F_PartNumber)
        REFERENCES Parts(PartVendorID, PartNumber)
     
)
Avatar billede arne_v Ekspert
29. september 2009 - 17:42 #7
proev:

CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY
 
    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
    , F_PartNumber VARCHAR(50) NOT NULL
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
 
    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID, F_PartNumber)
        REFERENCES Parts(PartVendorID, PartNumber)
     
)
Avatar billede arne_v Ekspert
29. september 2009 - 17:56 #8
ups - der skete vist noget
Avatar billede anders_cp Nybegynder
29. september 2009 - 18:02 #9
ja hee, alle gode gange 7, men det er også mit lykketal ;)

Det virkede. TAk for det. Manglede åbenbart at angive Constraint, kan jeg se af dit indlæg.

TAk for hjælpen, og læg et svar.
Avatar billede arne_v Ekspert
29. september 2009 - 18:09 #10
kommer her
Avatar billede anders_cp Nybegynder
01. oktober 2009 - 13:09 #11
Hej Arne
Du har fået dine velfortjente point, men da du er lidt inde i dette problem, vil jeg forsøge med et tillægsspørgsmål (jeg vil selvfølgelig give dig point = 60)

Den sammensatte primærnøgle fra Parts(PartVendorID, PartNumber) [Som ikke står til at ændre, uden at ødelægge resten af db-designet]

indeholder eksempelvis:
reservedele med producenter
partvendorid = 3  Partnumber "ofwejf"
partvendorid = 3  Partnumber = "wjeo"
Partvendorid = 4  Partnumber = "qqq9"
osv

Opgaven
Så ønsker jeg eksempelvis (Opdigtet) at give 10% rabat til Partner = Brugsen, så partner-brugsen får 10% rabat på reservedele fra partvendorid = 3 = NKT


Derfor virker min oprindelige PartnerDiscount ikke. Jeg ønsker kun adgang til den ENE del af primærnøglen (og det kan man vist ikke), Således:
CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY

    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
    , F_PartVendorID SMALLINT NOT NULL
   
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0

    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID)
        REFERENCES Parts(PartVendorID)
)

Det går ikke at fjerne referencen til den ene sammensattte primærnøgle (PartNumber) som her... men hvad gør jeg så?

Håber du vil kigge på det ;)
Avatar billede anders_cp Nybegynder
01. oktober 2009 - 13:12 #12
Summa Summarum at kunne søge på Brugsen og få at vide at de får 10% på følgende dele fra NKT:

10%
partvendorid = 3  Partnumber "ofwejf"
partvendorid = 3  Partnumber = "wjeo"

Normalpris
Partvendorid = 4  Partnumber = "qqq9"
Avatar billede arne_v Ekspert
01. oktober 2009 - 15:34 #13
Jeg forstaar ikke problemet.

Den query du vil lave kravere vel ikke nogen aendring i tabelstruktur.
Avatar billede anders_cp Nybegynder
01. oktober 2009 - 16:03 #14
Jeg prøver at gøre det kort, kogt ned til det essentielle. To Tabeller:

Parts
------
PK - PartVendorID
PK - PartNumber

PartnerDiscount
---------------
PK - PartnerDiscountID
F_PartVendorID
DiscountProcent
F_PartnerID

Jeg kan ikke få lov til kun at lave reference til den ene af primærnøglerne i Parts-tabellen.

Konkret:
CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY

    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
       
    , F_PartVendorID SMALLINT NOT NULL -- Nøgle 1 af sammensat primærnøgle fra Parts
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
   
    -- Husk at adde en Constraint. FOREIGN KEY(F_PartVendorID, F_PartNumber)... er ikke nok
    ,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID)
        REFERENCES Parts(PartVendorID, PartNumber) 
)

vil jeg få fejlen:
Msg 8139, Level 16, State 0, Line 1
Number of referencing columns in foreign key differs from number of referenced columns, table 'PartnerDiscount'.
Avatar billede arne_v Ekspert
01. oktober 2009 - 21:32 #15
,CONSTRAINT foobar FOREIGN KEY(F_PartVendorID)
        REFERENCES Parts(PartVendorID)
Avatar billede arne_v Ekspert
01. oktober 2009 - 21:32 #16
PS: maaske skulle du skifte til et andet navn end foobar.
Avatar billede anders_cp Nybegynder
02. oktober 2009 - 15:39 #17
Det kan man heller ikke. Jeg tror det er fordi at Parts har to sammensatte primærnøgler, hvorfor man ikke må referere til blot den ene af dem.

CREATE TABLE PartnerDiscount
(
    PartnerDiscountID SMALLINT IDENTITY NOT NULL PRIMARY KEY

    , F_PartnerID    SMALLINT NOT NULL
        REFERENCES Partners(PartnerID)
       
    , F_PartVendorID SMALLINT NOT NULL -- Nøgle 1 af sammensat primærnøgle fra Parts
    , DiscountProcent    SMALLINT NOT NULL DEFAULT 0
   
    -- Husk at adde en Constraint. FOREIGN KEY(F_PartVendorID, F_PartNumber)... er ikke nok
    ,CONSTRAINT testbar FOREIGN KEY(F_PartVendorID)
        REFERENCES Parts(PartVendorID) 
)

.. og fejlmeddelelsen:
Msg 1776, Level 16, State 0, Line 2
There are no primary or candidate keys in the referenced table 'Parts' that match the referencing column list in the foreign key 'testbar'.
Msg 1750, Level 16, State 0, Line 2
Could not create constraint. See previous errors.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester