ورود

View Full Version : کوئری برای افزودن مقدار کلید خارجی



federrer
یک شنبه 22 بهمن 1385, 22:00 عصر
دو تا جدول داریم که از طریق یه کلید خارجی بهم متصل هستن .یعنی این فیلد در جدول اصلی بعنوان کلید اصلی تعریف شده و در جدول فرعی یه فیلد معمولیه.
میخوام وقتی مقدار رو درفیلد جدول اصلی وارد می کنم بصورت اتومات در جدول فرعی هم مقدار فیلد وارد شود .
چه کو ئری باید بنویسم؟؟؟

DonetKarvb
یک شنبه 22 بهمن 1385, 22:28 عصر
دو تا جدول داریم که از طریق یه کلید خارجی بهم متصل هستن .یعنی این فیلد در جدول اصلی بعنوان کلید اصلی تعریف شده و در جدول فرعی یه فیلد معمولیه.
میخوام وقتی مقدار رو درفیلد جدول اصلی وارد می کنم بصورت اتومات در جدول فرعی هم مقدار فیلد وارد شود .
چه کو ئری باید بنویسم؟؟؟
یک تریگر بنویس

zerobit-ltd
دوشنبه 23 بهمن 1385, 11:15 صبح
دو تا جدول داریم که از طریق یه کلید خارجی بهم متصل هستن .یعنی این فیلد در جدول اصلی بعنوان کلید اصلی تعریف شده و در جدول فرعی یه فیلد معمولیه.
میخوام وقتی مقدار رو درفیلد جدول اصلی وارد می کنم بصورت اتومات در جدول فرعی هم مقدار فیلد وارد شود .
چه کو ئری باید بنویسم؟؟؟

اگر داده ها رو به صورت دستی وارد می کنید، بهترین و شاید تنها روش، روش دوست خوبمون DonetKarvb باشه.
اگر درج داده ها از طریق sp هستش، باز هم روش DonetKarvb جواب می ده. ولی من خودم برای این کار از trigger ها استفاده نمی کنم و ترجیح می دم داخل sp ، یه insert کوچولو هم بنویسم.

federrer
دوشنبه 23 بهمن 1385, 17:32 عصر
چیز عجیب غریب و پیچیده ای نیست !
چند تا جدول اصلی داریم به اسم SECTOR که در هر کدوم PrimaryKey اسمش هست ID که با اضافه شدن هر رکورد به مقدار اون یه دونه اضافه می شه
یه جدول مادر داریم به اسم ATC که برای رابطه با تک تک جدول های SECTOR ء از هر جدول ء فیلد ID رو به عنوان کلید خارجی قرض می گیره
یعنی تو جدول ATC یه فیلد داریم به اسم IDSECTOR1 که دقیقا مشخصه که همون فیلد ID در جدول SECTOR1 هست و یه فیلد داریم به اسم IDSECTOR2 که همون فیلد ID در جدول SECTOR2 هست و ......
تو خود جدول ATC هم PrimaryKey اسمش هست ID که با اضافه شدن هر رکورد به مقدار اون یه دونه اضافه می شه
حالا جای جالب داستان اینجاست D: تمام جدول های SECTOR و جدول مادر که اسمش ATC بود همشون تو یه فرم عملیات INSERT شون انجام میشه !

من الان به راحتی می تونم برای تک تک جدول های SECTOR یه خط QUERY بنویسم و Insert رو براشون انجام بدم (به زبان سی شارپ)

;"(String insertsector1="INSERT INTO SECTOR1(P1,P2)VALUES(S1.text,S2.text
(چون با اضافه کردن رکورد مقدار ID بطور خودکار +1 می شود ء دیگر نیاز نیست از طریق QUERY آن را وارد کنیم)
ولی برای جدول ATC که فیلد کلید اصلی هر جدول SECTOR رو تو خودش داره
برای پر کردن این فیلدها به مشکل خوردم
;"(?????,????) String insertsector1="INSERT INTO SECTOR1(IDSECTOR1,IDSECTOR2)VALUES

علامت سوالها یعنی اینکه هیچ OBJ ندارم که مقدار IDSECTOR ها رو ازش بخونم !!!!!!!!!!!!!!
پس ترجیح میدم یه کاری کنم که IDSECTOR ها بطور اتومات تو ATC هم اضافه شه D:

zerobit-ltd
دوشنبه 23 بهمن 1385, 18:28 عصر
منی که این پیشنهاد رو میدم، با trigger ها مشکل دارم. شاید با trigger ها انجام این کار راحت تر باشه. من حاضرم طبق روش خودم پیش برم، ولی از trigger ها استفاده نکنم.
اولا بهتره شما از stored procedure ها استفاده کنید.
دوما شما بعد از هر insert تو هر یک از جداول SECTORn، می تونید مقدار متغیر عمومی identity@@ رو بگیرید و در پایان اونا رو تو جدول ATC درج کنید.
شما راجع به این موضوع نظری نخواستید، ولی به نظر من طراحی جداول شما مشکل داره. اگر یه روز یه جدول SECTOR دیگه بخواید اضافه کنبد، می دونید چه مشکلی پیش میاد؟ اگر یکی از جداول SECTOR بخواد حذف بشه چطور؟ بازم معذرت می خوام که راجع به چیزی نظر دادم که مد نظر شما نبود.

federrer
چهارشنبه 25 بهمن 1385, 13:40 عصر
دمتون گرم که کمک کردین . رفتم دنبالش یه تابع گیر آوردم که و قتی میزاریش تو sp و اجرا می کنی دقیقا آخرین مقدار فیلد ID رو بر می گردونه
(' اسم جدول') SELECT IDENT_CURRENT
حالا می خوام برای تک تک جدولهای sector از این تابع استفاده کنم . نیاز دارم که نتیجه هر دستور select رو بریزم تو یه متغیر محلی که وقتی خواستم insert کنم راحت باشم !

دستوری پیدا نکردم که بتونم نتیجه هر SELECT رو بریزم تو یه متغیر محلی . چی کار کنم ؟؟؟؟

DonetKarvb
چهارشنبه 25 بهمن 1385, 14:10 عصر
دمتون گرم که کمک کردین . رفتم دنبالش یه تابع گیر آوردم که و قتی میزاریش تو sp و اجرا می کنی دقیقا آخرین مقدار فیلد ID رو بر می گردونه
(' اسم جدول') SELECT IDENT_CURRENT
حالا می خوام برای تک تک جدولهای sector از این تابع استفاده کنم . نیاز دارم که نتیجه هر دستور select رو بریزم تو یه متغیر محلی که وقتی خواستم insert کنم راحت باشم !

دستوری پیدا نکردم که بتونم نتیجه هر SELECT رو بریزم تو یه متغیر محلی . چی کار کنم ؟؟؟؟
خروجی سالکت عموما" یک تیبل است که شما باید یک TempTable با ساختار مشابه ساختار خروجی سلکت بسازید.
ولی من احساس میکنم راه بهتری هم باشه میشه دقیقا" بگید که میخواید چکار بکنید.؟

federrer
چهارشنبه 25 بهمن 1385, 18:53 عصر
چند تا تیبل با اسم ... ,1,2,3 Sector داریم که هر تیبل یه کلید اصلی به اسم ID داره که با اضافه کردن هر رکورد, +1 می شه

ID ها بطور دستی وارد نمی شن یعنی Textbox ی برای ورود ندارن .

حالا می خوام مقدار این ID ها رو از تک تک این جدول های Sector بخونم و بعنوان کلید خارجی بریزم تو یه تیبل مادر !

با استفاده از تابع
('SELECT IDENT_CURRENT('TABLE NAME
می تونم ID ها رو از تیبل خودشون بیرون بکشم . یعنی خروجی تابع بالا برای هر تیبل یه عدد ه یا بقول شما یه تیبله با یه فیلد که یه مقدار هم بیشتر نداره!

تا اینجا مشکلی نیست ! ولی چه جوری می تونم خروجی تابع بالا یعنی همون عدده (یه تیبله با یه فیلد که یه مقدار هم بیشتر نداره )رو بریزم تو تیبل مادر ؟؟؟؟؟

می تونم خروجی تابع رو بریزم تو یه temptable بعد از اون تو دستور Insert استفاده کنم ؟؟؟ یا راه بهتری سراغ داری ؟

zerobit-ltd
چهارشنبه 25 بهمن 1385, 19:15 عصر
باید اول تمام ID های جداول Sector رو بخونی و هر کدوم رو تو یه متغیر جدا بریزی. بعد همه رو با هم تو جدول مادر insert کنی. اگر تعداد جداول Sector همیشه ثابت هستند و هیچ وقت تعداد اونها کم یا زیاد نمیشه، بهترین راه همینه. در غیر این صورت، باید یه dynamic query بنویسی.

federrer
چهارشنبه 25 بهمن 1385, 20:48 عصر
تعداد جداول Sector همیشه ثابت هستند
با استفاده از تابع
('SELECT IDENT_CURRENT('TABLE NAME
می تونم ID ها رو از تیبل هاشون بیرون بکشم . یعنی خروجی تابع بالا یه تیبله با یه فیلد !

اگر خروجی تابع بالا رو بریزم تو یه temptable - اونوقت می تونم تو دستور insert کردن جدول مادر ء هر temptable رو بریزم تو یه فیلداز نوع INT ؟؟؟؟

zerobit-ltd
پنج شنبه 26 بهمن 1385, 11:00 صبح
فکر نکنم از راهی که شما گفتید ممکن باشه. چون شما باید داخل temp table به ازای هر جدول Sector یه رکورد درج کنید. بعد باید دوباره تمام اون رکوردها بخونید و تو جدول مادر insert کنید. مشکل اینجاست که نمی تونید همه اونها رو با یه دستور insert تو جدول مادر درج کنید.
خب شما حاصل ('SELECT IDENT_CURRENT('TABLE NAME برای هر جدول Sector رو تو یه متغیر بریزید و آخر سر همه اونها رو تو جدول مادر insert کنید.


declare @Sector1_ID int,
@Sector2_ID int,
@Sector3_ID int,
@Sector4_ID int

select @Sector1_ID = ident_current('tbl_Sector1'),
@Sector2_ID = ident_current('tbl_Sector2'),
@Sector3_ID = ident_current('tbl_Sector3'),
@Sector4_ID = ident_current('tbl_Sector4')

insert into tbl_ATC (Sector1, Sector2, Sector3, Sector4)
values(@Sector1_ID, @Sector2_ID, @Sector3_ID,@Sector4_ID)

federrer
پنج شنبه 26 بهمن 1385, 22:05 عصر
دمت گرم وقتی اجراشو دیدم حال کردم :تشویق: .ID ها مثال باقلوا وارد ATC میشن !

از این که موضوع رو پیگیری کردی خیلی ممنون:بوس:

آدم خیلی وقتها یه چیز هایی به ذهنش میرسه ولی تو پیادهسازیش می مونه