Problem z kluczem obcym

Odpowiedz Nowy wątek
2011-07-18 00:11
0

Cześć,
Mam taką sytuację:
Tablica Zadanie: SysZadanie, SysWiadomosc
Tablica Email: SysEmail, Temat, Tresc, Do, itd...
Tablica Sms: SysSms, Text, Numer
Tablica GG: SysGG, Text...

Jest możliwosć połączenia (stworzenia kluczy obcych), SysWiadomosc z SysEmail, potem SysWiadomosc z SysSms i SysWiadomosc z SysGG. Tzn stworzenia 3 kluczy obcych ? Jest to w ogóle możliwe?

Jeżeli nie, to w jaki sposób rozwiązać taki problem? - tj. W tablicy Zadanie w kolumnie SysWiadomosc, będą identyfikatory wszystkich typów zadań. Oczywiście ta kolumna nie jest unikalna.

edytowany 2x, ostatnio: now77ak, 2011-07-18 00:12

Pozostało 580 znaków

2011-07-18 08:57
0

Generalnie nie ma ograniczenia na ilość kluczy obcych, więc tworzysz ich sobie ile Ci potrzeba. Tu masz krótką definicję klucza obcego (http://pl.wikipedia.org/wiki/Klucz_obcy)


edytowany 1x, ostatnio: Gregory_Scot, 2011-07-18 08:58

Pozostało 580 znaków

2011-07-18 15:13
0

Wchodze w tabele "Zadanie", dodaje klucz obcy, zaznaczam odpowiednio "SysSmsMessage" z tablicy "SmsMessage" i "SysMessage" z tablicy "Task". Dodaje. Chcę zapisać i taki błąd:

 
'SmsMessage' TABLE saved successfully
'Task' TABLE
- Unable TO CREATE relationship 'FK_Task_SmsMessage'.  
The ALTER TABLE statement conflicted WITH the FOREIGN KEY CONSTRAINT "FK_Task_SmsMessage". The conflict occurred IN DATABASE "mgdb", TABLE "dbo.SmsMessage", COLUMN 'SysSmsMessage'.

Coś jest nie tak z kolumną SysSmsMessage. Jest to zwykła kolumna, int, primary_key w tablicy SmsMessage.

edytowany 1x, ostatnio: now77ak, 2011-07-18 15:15

Pozostało 580 znaków

2011-07-18 15:18
0

Nie ma żadnych ograniczeń ani co do ilości kluczy, ani też co do ilości atrybutów w kluczu. Możesz połączyć wszystko, ze wszystkim pamiętając, że wartość pola w atrybut1 musi być równa wartości atrybut2. Czyli w Twoim przypadku w jednej tabeli SysWiadomosc przyjmuje 'XXX' to w innej tabeli SysEmail też musi przyjmować 'XXX' i w tej drugiej tabeli czyli SysEmail masz jakieś dane uzupełniające dla wartości atrybutu z tabeli SysWiadomość. Patrząc na Twoje nazwy tabel ciężko się domyśleć co chcesz osiągnąc i czy to jest dobre rozwiązanie. Może masz źle zaprojektowaną bazę danych?

W tablicy Zadanie w kolumnie SysWiadomosc, będą identyfikatory wszystkich typów zadań. Oczywiście ta kolumna nie jest unikalna.

Może utwórz nową tablicę Identyfikatory, w której będziesz miał id_identyfikatora oraz inne atrybuty odpowiadające tym identyfikatorom, bo jeżeli masz w tablicy Zadanie atrybut SysWiadomosc, w której jest identyfikator typów zadań i potem w tej samej tabeli masz jakieś inne atrybuty odnoszące się do tego identyfikatora to mamy do czynienia z nadmiarowością danych.

Wklej proszę strukturę Twoich tabel oraz opisz za co są odpowiedzialne poszczególne atrbuty, a będziemy mogli Ci pomóc dokładniej.

Pozdrowienia z Konina.


Latam i transportuje żel do włosów dla komarów.

Pozostało 580 znaków

2011-07-18 16:43
0

Podaj definicję SmsMessage (z informacją które pole(-a) jest PK) oraz definicję tabeli Task.
Napisz między którymi kolumnami chcesz stworzyć klucz obcy. Swoją drogą klucz obcy powinien wskazywać na klucz główny w drugiej tabeli, jesteś pewien że u ciebie tak jest. Oraz że kolumny są tego samego typu?

Pozostało 580 znaków

2011-07-18 16:48
0

user image

Chcę połączyć jeszcze table SMS i Fax do tabeli Task.

Pozostało 580 znaków

2011-07-18 17:49
0

now77ak: jeszcze struktury tabel wklej.


Latam i transportuje żel do włosów dla komarów.
edytowany 1x, ostatnio: lotnik.na.niebieskim.sloniu, 2011-07-18 17:49

Pozostało 580 znaków

2011-07-18 17:56
0

Powiązań między tabelami nie kopiowałem

CREATE TABLE [dbo].[EmailMessage](
    [SysEmailMessage] [INT] IDENTITY(1,1) NOT NULL,
    [SysEmailServer] [INT] NOT NULL,
    [SysSendTo] [INT] NULL,
    [SysCc] [INT] NULL,
    [SysBcc] [INT] NULL,
    [Topic] [VARCHAR](2000) NULL,
    [Body] [text] NULL,
    [IsBodyHtml] [bit] NULL,
 CONSTRAINT [PK_EmailMessage] PRIMARY KEY CLUSTERED 
(
    [SysEmailMessage] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
 
CREATE TABLE [dbo].[FaxMessage](
    [SysFaxMessage] [INT] IDENTITY(1,1) NOT NULL,
    [SysSendTo] [INT] NULL,
    [FaxFile] [varbinary](MAX) NULL,
 CONSTRAINT [PK_FaxMessage] PRIMARY KEY CLUSTERED 
(
    [SysFaxMessage] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
CREATE TABLE [dbo].[SmsMessage](
    [SysSmsMessage] [INT] IDENTITY(1,1) NOT NULL,
    [SysSendTo] [INT] NULL,
    [Body] [VARCHAR](2048) NULL,
 CONSTRAINT [PK_SmsMessage] PRIMARY KEY CLUSTERED 
(
    [SysSmsMessage] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO
 
CREATE TABLE [dbo].[Task](
    [SysTask] [INT] IDENTITY(1,1) NOT NULL,
    [SysTaskType] [INT] NOT NULL,
    [SysTaskStatus] [INT] NOT NULL,
    [SysSchedule] [INT] NULL,
    [SysError] [INT] NULL,
    [SysMessage] [INT] NULL,
    [CreationDate] [datetime] NOT NULL,
    [ExecutionDate] [datetime] NULL,
    [TaskOwner] [VARCHAR](255) NOT NULL,
    [Priority] [INT] NULL,
    [Comments] [VARCHAR](1024) NULL,
 CONSTRAINT [PK_Task] PRIMARY KEY CLUSTERED 
(
    [SysTask] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 

Pozostało 580 znaków

2011-07-18 21:05
0

Zapytam inaczej,

W jaki sposób zaprojektować bazę danych w ten sposób, aby zrealizować takie połączenia?
Tzn mam tablicę Zadanie. Zadaniem może być wysłanie różnego typu wiadomości, każdy typ zapisany jest w osobnej tablicy. Dlatego w tablicy Zadanie jest kolumną "SysWiadomosc" oraz kolumna "Typ". Kolumna "SysWiadomosc" ma wskazywać na identyfikator z odpowiedniej tabeli (Email, Sms, GG, Fax itp itd), zależnej od kolumny "Typ".

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0