błąd przy tworzeniu relacji w SQL Server

0

Witam,

Mam 3 tabele: Nauczyciele, Przedmioty, NauczycieleInPrzedmioty.
Tabele nauczyciele i przedmioty zawierają oczywiście swoje Primary Key,
a ta trzecia tabela ma powiązania dwóch id, tj. jakie przedmioty naucza dany nauczyciel.
Gdy chce stworzyć relacje miedzy tymi trzema tabelami otrzymuje komunikat:
"The columns in table do not match an existing primary key or unique"

Z jakiego powodu może mi się wyświetlać ten komunikat?

0

pokaż może jak wyglądają DDL tabel i jak próbujesz założyć FK

0

Nie wiem czy dobrze ale według pewnej instrukcji wygenerowałem taki kod tych 3 tabel, relacje są jedynie pomiędzy tabelami a asp_Users które są wygenerowane przez model uwierzytelniania wbudowany przez MS, gdy jednak chcę utworzyć relacje pomiędzy moimi tabelami otrzymuję powyższy komunikat.

USE [zaplanuj.eu]
GO
/****** Object:  Table [dbo].[Subjects]    Script Date: 2013-09-30 19:37:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Subjects](
	[Subject_Id] [int] IDENTITY(1,1) NOT NULL,
	[User_Id] [uniqueidentifier] NOT NULL,
	[TypeSchool] [int] NOT NULL,
	[Name] [varchar](30) NOT NULL,
	[ShortName] [varchar](10) NULL,
 CONSTRAINT [PK_Subjects_1] PRIMARY KEY CLUSTERED 
(
	[Subject_Id] ASC,
	[User_Id] 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
SET ANSI_PADDING OFF
GO


/****** Object:  Table [dbo].[SubjectsInTeachers]    Script Date: 2013-09-30 19:37:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SubjectsInTeachers](
	[Teacher_Id] [int] NOT NULL,
	[Subject_Id] [int] NOT NULL,
 CONSTRAINT [PK_SubjectsInTeachers] PRIMARY KEY CLUSTERED 
(
	[Teacher_Id] ASC,
	[Subject_Id] 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


/****** Object:  Table [dbo].[Teachers]    Script Date: 2013-09-30 19:37:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Teachers](
	[Teacher_Id] [int] IDENTITY(1,1) NOT NULL,
	[User_Id] [uniqueidentifier] NOT NULL,
	[TypeSchool] [int] NOT NULL,
	[Rank] [varchar](20) NULL,
	[Name] [varchar](30) NOT NULL,
	[Surname] [varchar](30) NOT NULL,
 CONSTRAINT [PK_Teachers] PRIMARY KEY CLUSTERED 
(
	[Teacher_Id] ASC,
	[User_Id] 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
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Subjects]  WITH CHECK ADD  CONSTRAINT [FK_Subjects_aspnet_Users] FOREIGN KEY([User_Id])
REFERENCES [dbo].[aspnet_Users] ([UserId])
GO
ALTER TABLE [dbo].[Subjects] CHECK CONSTRAINT [FK_Subjects_aspnet_Users]
GO
ALTER TABLE [dbo].[Teachers]  WITH CHECK ADD  CONSTRAINT [FK_Teachers_aspnet_Users] FOREIGN KEY([User_Id])
REFERENCES [dbo].[aspnet_Users] ([UserId])
GO
ALTER TABLE [dbo].[Teachers] CHECK CONSTRAINT [FK_Teachers_aspnet_Users]
GO
0

nie możesz mieć tabeli SubjectsInTeachers z dwoma polami ponieważ w pozostałych tabelach klucze główne (każdy) masz na DWÓCH polach. BTW po co w tych tabelach są klucze główne złożone także na kolumnie User_Id i co ona trzyma?

0

Chodzi o to ze user_id precyzuje do jakiego użytkownika nalezą różne dane, a teacher_id (czyli różni nauczyciele) powinni zawierać listę przedmiotów jakich nauczają czyli subject_id, z tego wywnioskowałem że muszę zrobić relacje wiele-do-wielu. Mam także tabelę asp_Users która zawiera pole id_user która ma swój PK, jestem początkujący i dlatego ustawiłem także PK w innych tabelach gdzie jest pole user_id, i moje pytanie czy to dobrze zrobiłem? i czy w ogóle w innych tabelach poza asp_users powinien być ustawiony PK, mam z tym kłopot i nie moge do końca tego ogarnąć. Więc jak to powinno wyglądać aby było prawidłowo. Zasugerowałem się tym ze w uwierzytelniani MS jest tabela UsersInRoles i tam podobnie jest to wykonane i podobnie też są ustawione PK i tam relacje też są ustawione tak jak ja bym chciał więc starałem się zrobić tak samo.
Jak już pisałem dopiero zaczynam zagłębiać technologie SQL Server'a także prosze o wyrozumiałość.

0
jawka7 napisał(a):

Chodzi o to ze user_id precyzuje do jakiego użytkownika nalezą różne dane, a teacher_id (czyli różni nauczyciele) powinni zawierać listę przedmiotów jakich nauczają czyli subject_id, z tego wywnioskowałem że muszę zrobić relacje wiele-do-wielu.

No ok, to jak najbardziej wiele do wielu. A po co w końcu te PK na kolumnie user_id? Czym w ogóle jest user_id z punktu widzenia modelowanego problemu? Czemu ona w ogóle jest w tych tabelach?

Jak już pisałem dopiero zaczynam zagłębiać technologie SQL Server'a także prosze o wyrozumiałość.

No ok, ale Twoje pytania nie mają związku z SQL Serverem, tylko ogólnie z bazami danych.

0

User_id jest powiązana z tabelą asp_Users po to ze gdy się ludzie logują do mojej aplikacji to potrzebuje pobrać te dane które do niego należą z tego własnie wynika że użytkownik zalogowany widzi swoich nauczycieli których wprowadził do bazy, ma to pewien sens który wynika właśnie ze specyfikacji mojej aplikacji.
A co do mojego pytania, to ja rozumiem że relacje występują w wielu zagadnieniach baz danych nie tylko w sql serverze, ale ten problem tyczy się konkretnie sql servera ponieważ gdy chcę utworzyć relacje miedzy tabelami tak jak podałem wiele-do-wielu (np: połączyć Teacher_Id z tabeli Teachers z Teachers_Id z tabeli SubjectsInTeachers i analogicznie z tabela Subjects) właśnie w sql menagment studio otrzymuję błąd "The columns in table do not match an existing primary key or unique" i nie mogę utworzyć relacji z czym nie miałem problemu gdy tworzyłem tą relacje łącząc pola User_Id, proszę o wskazanie błędu jakie popełniam oraz czemu otrzymuje taki błąd.

1
jawka7 napisał(a):

User_id jest powiązana z tabelą asp_Users po to ze gdy się ludzie logują do mojej aplikacji to potrzebuje pobrać te dane które do niego należą z tego własnie wynika że użytkownik zalogowany widzi swoich nauczycieli których wprowadził do bazy, ma to pewien sens który wynika właśnie ze specyfikacji mojej aplikacji.

Czyli User_id to klasyczny przykład klucza obcego, więc po co czynisz go kluczem głównym? To nie ma sensu i tyle.

A co do mojego pytania, to ja rozumiem że relacje występują w wielu zagadnieniach baz danych nie tylko w sql serverze, ale ten problem tyczy się konkretnie sql servera

W takim razie, powiedz, w jakiej bazie danych zrobisz to, co chcesz osiągnąć tutaj. Bo skoro to problem SQL Servera, to znaczy, że inne serwery baz danych to umożliwiają - czyż nie?

ponieważ gdy chcę utworzyć relacje miedzy tabelami tak jak podałem wiele-do-wielu (np: połączyć Teacher_Id z tabeli Teachers z Teachers_Id z tabeli SubjectsInTeachers i analogicznie z tabela Subjects) właśnie w sql menagment studio otrzymuję błąd "The columns in table do not match an existing primary key or unique" i nie mogę utworzyć relacji z czym nie miałem problemu gdy tworzyłem tą relacje łącząc pola User_Id, proszę o wskazanie błędu jakie popełniam oraz czemu otrzymuje taki błąd.

Twoja tabela N do N (SubjectsInTeachers) posiada DWIE kolumny, które mają być kluczami obcymi z DWÓCH innych tabel, z których każda ma klucz oparty na DWÓCH kolumnach. A DWA razy DWA to CZTERY, a nie DWA. Nie możesz wcisnąć kluczy obcych mających w sumie cztery kolumny do dwukolumnowej tabeli.
Więc albo SubjectsInTeachers ma mieć cztery kolumny, albo klucze w Subjects i Teachers mają mieć po jednej kolumnie (tak, jak moim zdaniem powinno być w tym przypadku, bo User_id jest w nich obu zbędne).

0

No właśnie, dzięki wielkie teraz zrozumiałem jak działają PK, ponieważ do tej pory nie wiedziałem że nadajac klucze kilku kolumnom to te klucze łączą się w jeden także teraz wszystko działa dzięki dielkie ;)

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