PDA

View Full Version : مشکل با کلید خارجی !



mohammad973
سه شنبه 15 اسفند 1391, 19:29 عصر
سلام دوستان .
من جدولی دارم به نام SampleTable که دارای 4 تا ستون هست :
S_ID
S_name
S_ParentGroupID
S_State

کلید اصلی جدول S_ID هست و S_ParentGroupID کلید خارجی منه که به ستون S_ID از همین جدول اشاره داره . مشکل من در درج اولین رکورد در پایگاه داده هست ! چون داده ای ندارم ، هنگام درج اولین رکورد ، به خاطر وجود کلید خارجی ، خطا میده . چطوری میتونم داده به جدولم Insert کنم ؟؟؟؟:متفکر:

یوسف زالی
سه شنبه 15 اسفند 1391, 19:41 عصر
سلام.
یک ردیف با داده های صفر باید درج کنید.
ردیف بعدی از این داده شاخه گیری می شه.

mohammad973
سه شنبه 15 اسفند 1391, 20:34 عصر
ببینید کلید اصلی منIdentity هست و از یک شروع میکنه . من یک سطر با مقدار کلید اصلی و کلید خارجی مساوی با یک قرار دادم . ولی باز ایراد کلید خارجی میگیره و قبول نمیکنه !

یوسف زالی
سه شنبه 15 اسفند 1391, 20:39 عصر
CREATE TABLE [dbo].[RelTbl](
[SN] [int] IDENTITY(1,1) NOT NULL,
[Rel] [int] NOT NULL,
[Data] [int] NOT NULL,
CONSTRAINT [PK_RelTbl] PRIMARY KEY CLUSTERED
(
[SN] 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].[RelTbl] WITH CHECK ADD CONSTRAINT [FK_RelTbl_RelTbl] FOREIGN KEY([Rel])
REFERENCES [dbo].[RelTbl] ([SN])
GO

ALTER TABLE [dbo].[RelTbl] CHECK CONSTRAINT [FK_RelTbl_RelTbl]
GO


کد



--truncate table RelTbl

insert into RelTbl
select 1, 10

select *
from RelTbl


!!No Problem

محمد سلیم آبادی
سه شنبه 15 اسفند 1391, 20:47 عصر
سلام دوستان .
من جدولی دارم به نام SampleTable که دارای 4 تا ستون هست :
S_ID
S_name
S_ParentGroupID
S_State

کلید اصلی جدول S_ID هست و S_ParentGroupID کلید خارجی منه که به ستون S_ID از همین جدول اشاره داره . مشکل من در درج اولین رکورد در پایگاه داده هست ! چون داده ای ندارم ، هنگام درج اولین رکورد ، به خاطر وجود کلید خارجی ، خطا میده . چطوری میتونم داده به جدولم Insert کنم ؟؟؟؟:متفکر:
مقدار Parent اولین گره از درخت را باید NULL تنظیم کنید.
بطور مثال در این پست داده های سه درخت درج شده است:
http://puresql.blogsky.com/1391/12/13/post-5/

mohammad973
سه شنبه 15 اسفند 1391, 23:46 عصر
وقتی خودم به صورت دستی میرم و اینکار رو میکنم ، مشکلی نداره و درج میشه .

مشکل اینجاست که من دارم روی پنل مدیریت یک سایت کار میکنم . کاربر من که نمیتونه دستی INSERT کنه ! اومدیمو تاپل "ریشه" رو پاک کرد. از پنل هنگام درج چنین رکوردی ، خطا داده میشه !

آیا میشه کاری کرد که از محتوای یک یا دو تاپل از یک جدول ، از حذف محافظت بشه ؟

یوسف زالی
چهارشنبه 16 اسفند 1391, 00:16 صبح
برای حذف شرط بگذارید و با If کنترلش کنید.
می تونید از Try هم استفاده کنید که ایده ی خوبی نیست.

محمد سلیم آبادی
چهارشنبه 16 اسفند 1391, 06:05 صبح
آیا میشه کاری کرد که از محتوای یک یا دو تاپل از یک جدول ، از حذف محافظت بشه ؟ خیر،
ولی بجاش میتوانید قبل از حذف کردن کلید خارجی تان را غیر فعال کنید و بعد از آن با خصیصه WITH NOCHECK آن را فعال کنید. اینجا (http://www.dotnettips.info/post/1220/%D9%81%D8%B9%D8%A7%D9%84-%D9%88-%D8%BA%DB%8C%D8%B1-%D9%81%D8%B9%D8%A7%D9%84-%DA%A9%D8%B1%D8%AF%D9%86-%D9%82%DB%8C%D9%88%D8%AF)را ببینید