PDA

View Full Version : استفاده از کلید خارجی



Iran58
یک شنبه 08 بهمن 1391, 20:24 عصر
سلام
فرض کنیم سه جدول داریم که در جدول b یک ستون شماره پرسنلی داریم که کلید خارجی است و از جدول a می خوانیم حالا یک جدول c داریم که این جدول هم یک ستون داریم که در آن باتوجه به داده هایمان می خواهیم از ستون شماره پرسنلی جدول b بخوانیم که حودش کلید خارجی است
حال سوال من اینست که این کار شدنی است یا نه
اگر هست یک مثال لطفا ارائه دهید
اگر نیست لطفا راهنمایی بفرمایید چکاری باید انجام بدهم
باتشکر

Iran58
یک شنبه 08 بهمن 1391, 21:24 عصر
سلام
مشکل من اینه که
در حدولc می خواهم شماره پرسنلی ها بر اساس جدول b شود نه مsستقیمااز جدول a

محمد سلیم آبادی
یک شنبه 08 بهمن 1391, 22:31 عصر
سلام
فرض کنیم سه جدول داریم که در جدول b یک ستون شماره پرسنلی داریم که کلید خارجی است و از جدول a می خوانیم حالا یک جدول c داریم که این جدول هم یک ستون داریم که در آن باتوجه به داده هایمان می خواهیم از ستون شماره پرسنلی جدول b بخوانیم که حودش کلید خارجی است
حال سوال من اینست که این کار شدنی است یا نه
اگر هست یک مثال لطفا ارائه دهید
اگر نیست لطفا راهنمایی بفرمایید چکاری باید انجام بدهم
باتشکر
سلام
یک کلید خارجی دو سر دارد، ارجاع دهنده و ارجاع شونده.
ستون (یا ستون های) ارجاع شونده یا همان مرجع باید از نوع کاندید(کلید unique یا primary key) باشد. در صورتی که مقدار مرجع شما (که کلید خارجی است) یکتا نبوده. و این مغایر است با قوانین نرمال سازی...

Iran58
سه شنبه 10 بهمن 1391, 18:06 عصر
سلام
مهندس جان پس برای این کار نظر شما چیست؟
یعنی من باید دوبار از پرسنلی استفاده کنم
باتشکر

Iran58
سه شنبه 10 بهمن 1391, 20:41 عصر
سلام مجدد
من جدولهای زیر را طراحی کرده ام
جدول Validity
CREATE TABLE [dbo].[Validity](
[Id] [tinyint] IDENTITY(1,1) NOT NULL,
[Number] [char](8) NULL,
CONSTRAINT [PK_Validity] PRIMARY KEY CLUSTERED
(
[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
جدول ware
CREATE TABLE [dbo].[Ware](
[Id] [tinyint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL,
[Code] [char](13) NULL,
[MateriallNumber] [char](8) NULL,
CONSTRAINT [PK_Ware] PRIMARY KEY CLUSTERED
(
[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
جدول Aliennee
CREATE TABLE [dbo].[Alienee](
[Id] [tinyint] IDENTITY(10,1) NOT NULL,
[Name] [nvarchar](30) NULL,
[Code] [char](6) NULL,
CONSTRAINT [PK_Aliennee] PRIMARY KEY CLUSTERED
(
[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
جدولEntryDocument
CREATE TABLE [dbo].[CREATE TABLE [dbo].[EntryDocument](
[Id] [smallint] IDENTITY(10000,1) NOT NULL,
[NumberDocument] [char](6) NULL,
[AlienneeName] [tinyint] NULL,
[Ware1] [tinyint] NULL,
[Quantity1] [int] NULL,
[Ware2] [tinyint] NULL,
[Quantity2] [int] NULL,
[Ware3] [tinyint] NULL,
[Quantity3] [int] NULL,
[Date] [datetime] NULL,
CONSTRAINT [PK_EntryDocument] PRIMARY KEY CLUSTERED
(
[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].[EntryDocument] WITH CHECK ADD CONSTRAINT [FK_EntryDocument_Alienee] FOREIGN KEY([AlienneeName])
REFERENCES [dbo].[Alienee] ([Id])
GO

ALTER TABLE [dbo].[EntryDocument] CHECK CONSTRAINT [FK_EntryDocument_Alienee]
GO

ALTER TABLE [dbo].[EntryDocument] WITH CHECK ADD CONSTRAINT [FK_EntryDocument_Ware] FOREIGN KEY([Ware1])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryDocument] CHECK CONSTRAINT [FK_EntryDocument_Ware]
GO

ALTER TABLE [dbo].[EntryDocument] WITH CHECK ADD CONSTRAINT [FK_EntryDocument_Ware1] FOREIGN KEY([Ware2])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryDocument] CHECK CONSTRAINT [FK_EntryDocument_Ware1]
GO

ALTER TABLE [dbo].[EntryDocument] WITH CHECK ADD CONSTRAINT [FK_EntryDocument_Ware2] FOREIGN KEY([Ware3])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryDocument] CHECK CONSTRAINT [FK_EntryDocument_Ware2]
GO

](
[Id] [smallint] IDENTITY(10000,1) NOT NULL,
[NumberDocument] [char](6) NULL,
[AlienneeName] [tinyint] NULL,
[Ware1] [tinyint] NULL,
[Quantity1] [int] NULL,
[Ware2] [tinyint] NULL,
[Quantity2] [int] NULL,
[Ware3] [tinyint] NULL,
[Quantity3] [int] NULL,
[Date] [datetime] NULL,
CONSTRAINT [PK_EntryDocument] PRIMARY KEY CLUSTERED
(
[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].[EntryDocument] WITH CHECK ADD CONSTRAINT [FK_EntryDocument_Alienee] FOREIGN KEY([AlienneeName])
REFERENCES [dbo].[Alienee] ([Id])
GO

ALTER TABLE [dbo].[EntryDocument] CHECK CONSTRAINT [FK_EntryDocument_Alienee]
GO

ALTER TABLE [dbo].[EntryDocument] WITH CHECK ADD CONSTRAINT [FK_EntryDocument_Ware] FOREIGN KEY([Ware1])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryDocument] CHECK CONSTRAINT [FK_EntryDocument_Ware]
GO

ALTER TABLE [dbo].[EntryDocument] WITH CHECK ADD CONSTRAINT [FK_EntryDocument_Ware1] FOREIGN KEY([Ware2])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryDocument] CHECK CONSTRAINT [FK_EntryDocument_Ware1]
GO

ALTER TABLE [dbo].[EntryDocument] WITH CHECK ADD CONSTRAINT [FK_EntryDocument_Ware2] FOREIGN KEY([Ware3])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryDocument] CHECK CONSTRAINT [FK_EntryDocument_Ware2]
GO


جدولEntryValidity
CREATE TABLE [dbo].[EntryValidity](
[Id] [tinyint] IDENTITY(1,1) NOT NULL,
[NumberLetter] [tinyint] NULL,
[AlienneeName] [tinyint] NULL,
[Ware1] [tinyint] NULL,
[Ware2] [tinyint] NULL,
[Ware3] [tinyint] NULL,
[Quantity] [int] NULL,
[FirstDate] [date] NULL,
[EndDate] [date] NULL,
CONSTRAINT [PK_EntryValidity] PRIMARY KEY CLUSTERED
(
[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

ALTER TABLE [dbo].[EntryValidity] WITH CHECK ADD CONSTRAINT [FK_EntryValidity_Aliennee] FOREIGN KEY([AlienneeName])
REFERENCES [dbo].[Alienee] ([Id])
GO

ALTER TABLE [dbo].[EntryValidity] CHECK CONSTRAINT [FK_EntryValidity_Aliennee]
GO

ALTER TABLE [dbo].[EntryValidity] WITH CHECK ADD CONSTRAINT [FK_EntryValidity_Validity] FOREIGN KEY([NumberLetter])
REFERENCES [dbo].[Validity] ([Id])
GO

ALTER TABLE [dbo].[EntryValidity] CHECK CONSTRAINT [FK_EntryValidity_Validity]
GO

ALTER TABLE [dbo].[EntryValidity] WITH CHECK ADD CONSTRAINT [FK_EntryValidity_Ware] FOREIGN KEY([Ware1])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryValidity] CHECK CONSTRAINT [FK_EntryValidity_Ware]
GO

ALTER TABLE [dbo].[EntryValidity] WITH CHECK ADD CONSTRAINT [FK_EntryValidity_Ware1] FOREIGN KEY([Ware2])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryValidity] CHECK CONSTRAINT [FK_EntryValidity_Ware1]
GO

ALTER TABLE [dbo].[EntryValidity] WITH CHECK ADD CONSTRAINT [FK_EntryValidity_Ware2] FOREIGN KEY([Ware3])
REFERENCES [dbo].[Ware] ([Id])
GO

ALTER TABLE [dbo].[EntryValidity] CHECK CONSTRAINT [FK_EntryValidity_Ware2]
GO



1)من از جدول wareبه جدول EntryValidity ارتباط داده ام
که هر خریدار چه جنسی را می تواند بخرد
و همچنین به جدول EntryDocument ارتباط داده ام
اما مشکل اصلی من این است که هنگامیکه می خواهم داده ای را در حدول EntryDocument ثبت کنم
می حواهم از wareهای که هر خریدار در EntryValidity ثبت شده است را انتخاب کنیم از هر حنسی که در جدول ware وجود دارد
(در کل یک جدول داریم که اسامی احناس در آن ثبت شده استware و یک چدول ثبت اعتبارها EntryValidityداریم که اجناس هر خریدار را از جدول ware پر می کنیم و همچنین جدولی که فروشهارا درآن ثبت می کنیمEntryDocument که در این جدول اجناس فروش را از جدول ware پر می کنیم اما می خواهم هر گاه در این جدول نام خربدار وارد شد فقط اجناسی را که حریدار مجاز به انتخاب آن ایت ثبت شود با توجه به جدولEntryValidity )
باتشکر

Iran58
پنج شنبه 12 بهمن 1391, 18:26 عصر
سلام
ببیند ما یکسری جنس از طریق مزایده به یک سری از اشخاص میفروشیم (طی دوره 4ماه)
1)برای اینکار من یک حدول جنس طراحی کرده ام که اسم احناس را درج می کنم
2)و یک جدول دارم که در آن هر شخصی که برنده شده است در مزایده و جنسهای را که برده است را ثبت می کنم جدول ثبت قرارداد(در اینجا یک کلید از جدول اجناس به این جدول می زنیم برای اسم احناس)
3)یک جدول داریم که در این جدول احناسی که شخص برنده هرروز از شرکت خارج می کند را ثبت می کنیم (در این جدول می خواهم هرگاه نام خریدار را وارد کردم فقط احناسی را که برنده شده است را مجاز به خروج آن باشد )
برای طراحی جدول سوم به مشکل برخورده ام چون می خواهم مستقیما اسامی اجناس را از جدول دوم بخوانم در صورتیکه اسامی احناس در جدول دوم خودشان کلید خارجی هستند نه کلید اصلی
دلیل اینکار هم این است که هر برنده جنس خودش را فقط بتواند از شرکت خارج کند
آیا راهی وحود دارد ویا می شود از حدول اول برای جدول سوم شرح اجناس را وارد کرد به شرطی که با کمک spاز جدول دوم شرح اجناس هر برنده را بخوانیم و در جدول سوم ثبت کینم
باتشکر

محمد سلیم آبادی
شنبه 14 بهمن 1391, 09:40 صبح
تا اینجایی که متوجه شدم شما نیاز دارین از یکی کلید ترکیبی در جدول "جنس های برنده شده" استفاده کنید. به این معنا که ترکیب ستون های کد کالا و کد برنده را unique در نظر بگیرید و در جدول دیگر به این کلید ارجاع دهید.