إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

كيف اربط 1 Foreign Key بـ 2 Primary Key


10 رد (ردود) على هذا الموضوع

#1 repotec

repotec

    عضو

  • الأعضــاء
  • 47 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 21 November 2010 - 10:00 PM

السلام عليكم ورحمة الله وبركاته

كيف لي ان اربط جدول فيه foreign key بجدولين اخرين في كل واحد فيه primary key
صورة

هل استخدم triggers وعمل القيود by manual لحل هذه المشكلة

عن عبد الله بن عمر رضي الله عنهما قال أخذ رسول الله صل الله عليه وسلم بمنكبي فقال كن في الدنيا كأنك غريب أو عابر سبيل


OCP_Logo.gif


#2 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,558 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 22 November 2010 - 12:50 AM

وعليكم السلام ورحمة الله

رجاء ايضاح ما هى نوعية البيانات المطلوب الربط بينها ... حتى تكون الإجابة واضحة

عموما اليك هذا المثال الموضح فى الصور المرفقه ...

واليك اوامر انشاء الجداول والعلاقات بينها
/*==============================================================*/
/* Table: item                                            	*/
/*==============================================================*/
create table item  (
   item_id        	NUMBER                      	not null,
   item_name      	VARCHAR2(40),
   constraint PK_ITEM primary key (item_id)
);

/*==============================================================*/
/* Table: invoice_matser                                  	*/
/*==============================================================*/
create table invoice_matser  (
   invoice_id 		NUMBER                      	not null,
   invoice_date   	date,
   invoice_desc   	VARCHAR2(50),
   constraint PK_INVOICE_MATSER primary key (invoice_id)
);

/*==============================================================*/
/* Table: invoice_detail                                  	*/
/*==============================================================*/
create table invoice_detail  (
   invoice_id 		NUMBER                      	not null,
   item_id        	NUMBER                      	not null,
   item_quanity   	NUMBER,
   item_price 		NUMBER,
   constraint PK_INVOICE_DETAIL primary key (item_id, invoice_id)
);

alter table invoice_detail
   add constraint FK_INVOICE__REFERENCE_ITEM foreign key (item_id)
  	references item (item_id);

alter table invoice_detail
   add constraint FK_INVOICE__REFERENCE_INVOICE_ foreign key (invoice_id)
  	references invoice_matser (invoice_id);

ملفات مرفقة

  • ملف مرفق  pdm_image.jpg   28.68كيلو   120 عدد مرات التحميل
  • ملف مرفق  erd_image.jpg   22.32كيلو   110 عدد مرات التحميل

لا إله إلا الله الحليم الكريم
لا اله إلا الله العلى العظيم
لا اله إلا الله رب السماوات السبع و رب العرش العظيم
‏اللهم ارزقني قبل الموت توبة وعند الموت شهادة وبعد الموت جنة
اللهم ارزقني حسن الخاتمة
اللهم هون علينا سكرات الموت ... ونور علينا قبورنا
اللهم ارزقني الموت وأنا ساجد لك يا ارحم الراحمين
اللهم ثبتني عند سؤال الملكين
اللهم اجعل قبري روضة من رياض الجنة ولا تجعله حفرة من حفر النار
اللهم اني اعوذ بك من فتن الدنيا
اللهم ارحم ابائنا وامهاتنا واغفر لهما وتجاوز عن سيئاتهما وادخلهم فسيح جناتك ... والحقنا بهما يا رب العالمين
اللهم ارحم موتانا وموتى المسلمين واشفي مرضانا ومرضى المسلمين
اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الأحياء منهم والأموات
وبارك اللهم على سيدنا محمد صلى الله عليه وسلم
اللهم آمين ... اللهم آمين ... اللهم آمين


....


#3 repotec

repotec

    عضو

  • الأعضــاء
  • 47 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 22 November 2010 - 11:03 AM

أخي الحبيب ليس هذا قصدي
انظر للصورة الاتية وستفهم ماذا كنت اقصد
صورة

اي أن All_items يكون الأبن وأبواه هما in_item و out_item

لا أستطيع إدخال سجل في جدول الأبن إلا إذا كان موجود في أي من جدول الأبوين ,بمعني اخر أريد إبن له أبوين

تم التعديل بواسطة repotec, 22 November 2010 - 11:09 AM.

عن عبد الله بن عمر رضي الله عنهما قال أخذ رسول الله صل الله عليه وسلم بمنكبي فقال كن في الدنيا كأنك غريب أو عابر سبيل


OCP_Logo.gif


#4 Amgad

Amgad

    مشرف عام ومشرف قسم تحليل النظم

  • الفريق الإداري
  • 4,558 مشاركة
  • الاسم الأول:امجد
  • اسم العائلة:حلمي
  • البـلـد: Country Flag
  • المنصب الحالي:Business Systems Analyst at al Fanar Co. Riyadh KSA

تاريخ المشاركة 22 November 2010 - 11:30 PM

يمكنك عرض شرح لطبيعة ونوعية البيانات المطلوب التعامل معها ... حتى يمكن اقتراح الحل المناسب للربط بين الجداول

السؤال عن جدولي In_item , out_item

هل يوجد تطابق فى بيانات ال items .... فى كلا الحالتين
هل يمكن ان يتم التعامل مع نفس الitem .... باعتبارة in_item و out_item

لماذا لم يتم انشاء جدول موحد للitems مع وضع عمود لتحديد نوعية الitem هل هو in or out or both
هل ترميز وتكويد ال items سوف يختلف من حيث انه in or out

اقترح عليك مبدئيا انشاء جدول واحد يحتوى البيانات الأساسية للitems

لا إله إلا الله الحليم الكريم
لا اله إلا الله العلى العظيم
لا اله إلا الله رب السماوات السبع و رب العرش العظيم
‏اللهم ارزقني قبل الموت توبة وعند الموت شهادة وبعد الموت جنة
اللهم ارزقني حسن الخاتمة
اللهم هون علينا سكرات الموت ... ونور علينا قبورنا
اللهم ارزقني الموت وأنا ساجد لك يا ارحم الراحمين
اللهم ثبتني عند سؤال الملكين
اللهم اجعل قبري روضة من رياض الجنة ولا تجعله حفرة من حفر النار
اللهم اني اعوذ بك من فتن الدنيا
اللهم ارحم ابائنا وامهاتنا واغفر لهما وتجاوز عن سيئاتهما وادخلهم فسيح جناتك ... والحقنا بهما يا رب العالمين
اللهم ارحم موتانا وموتى المسلمين واشفي مرضانا ومرضى المسلمين
اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الأحياء منهم والأموات
وبارك اللهم على سيدنا محمد صلى الله عليه وسلم
اللهم آمين ... اللهم آمين ... اللهم آمين


....


#5 repotec

repotec

    عضو

  • الأعضــاء
  • 47 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 22 November 2010 - 11:48 PM

لابد التعامل مع All_item بعتباره كلا من in_item و out_item
نوع البيانات واحد



صورة

عن عبد الله بن عمر رضي الله عنهما قال أخذ رسول الله صل الله عليه وسلم بمنكبي فقال كن في الدنيا كأنك غريب أو عابر سبيل


OCP_Logo.gif


#6 وليد علاء الدين

وليد علاء الدين

    عضو

  • الأعضــاء
  • 32 مشاركة
  • الاهتمامات:internet, movies & Games

تاريخ المشاركة 23 November 2010 - 02:37 AM

ممكن تعمل اتنين foreign key constraint ... على نفس العمود يشاورا على اعمده مختلفه في جداول مختلفه ... انا جربتها و شغاله عادي
ممكن تستخدم SQL Developer في الشغل للتسهيل و تقدر تحمله من موقع اوراكل
نسي الطين ساعة انه طين حقير فصال تيها وعربد وكسا الخز جسمه فتباهى وحوى المال كيسه فتمرد


يا أخي لا تمل بوجهك عني ما انا فحمة ولا أنت فرقد أنت لم تصنع الحرير الذي تلبس واللؤلؤ الذي تتقلد

#7 repotec

repotec

    عضو

  • الأعضــاء
  • 47 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 23 November 2010 - 05:01 AM

الربط عن طريق القيود لا يتناسب معي لانه عندما اقوم بادخال بيانات في الجدول All_item تريد القيود ان تكون القيمة المدخلة في كلاً من الجدولين in_item, out_item - اي موجودة في In_item و موجوده في Out_item وهذا ما لا اريده, انا اريد ان تقوم القيود ان تحقق من القيمة المدخلة علي ان تكون القيمة أما في جدول In_item أو في Out_item - لابد ان تكون موجود ولكن في احد الجدولين

لو افترضنا ان جدول in_item فيه القيم 100و120و500 وجدول out_item فيه القيم 500و220و200 عندما يقوم المستخدم بإدخال قيم في جدول All_item - بطريقة الربط العادية فالقيمة الوحيدة الصالحة للدخول في جدول all_item هي 500 لانها موجودة في الجدولين وهذا ما لا اريده - ولكني اريد ان تكون القيمة المدخلة في جدول all_item في احد الجدولين



صورة

تم التعديل بواسطة repotec, 23 November 2010 - 05:33 AM.

عن عبد الله بن عمر رضي الله عنهما قال أخذ رسول الله صل الله عليه وسلم بمنكبي فقال كن في الدنيا كأنك غريب أو عابر سبيل


OCP_Logo.gif


#8 shaldum

shaldum

    عضو

  • الأعضــاء
  • 13 مشاركة

تاريخ المشاركة 23 November 2010 - 12:20 PM

create or replace trigger check_all_x_x1

  before insert on all_x  

  for each row

declare

-- cursoe to look in first table

cursor in_x1_cur is select x1 from in_x where x1 = :new.x1;

v_in_x1 number;

-- cursoe to look in second table

cursor out_x1_cur is select x1 from out_x where x1 = :new.x1;

v_out_x1 number;

begin

open in_x1_cur;

fetch in_x1_cur into v_in_x1;

close in_x1_cur;

--check if it not exist in first table

if v_in_x1 is null then -- will look in second table



open out_x1_cur;

fetch out_x1_cur into v_out_x1;

close out_x1_cur;

--check if it not exist in second table 

if v_out_x1 is null

then-- stop inserting

raise_application_error( -20001, 'check failed' );

  

else--if it exist in second table so will do nothing

null;

end if;-- the end of second if

else -- if it exist in first table will do nothing

null;

end if; -- the end of first if

end check_all_x_x1;

الم ينفخ فينا من روحة .... الم تسجد لنا الملائكة !!!


#9 shaldum

shaldum

    عضو

  • الأعضــاء
  • 13 مشاركة

تاريخ المشاركة 23 November 2010 - 12:29 PM

sorry b2a mesh 3aref 2b3atwo 27san men keda
el mohem ana elly 3ayez 2awsallw
ennak momken te3mel elly enta 3ayzo bas btari2a tanya
y3ni men 3'eer forign key or primary key and constraits
i wish it be helpful

الم ينفخ فينا من روحة .... الم تسجد لنا الملائكة !!!


#10 repotec

repotec

    عضو

  • الأعضــاء
  • 47 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 23 November 2010 - 01:56 PM

وهو المطلوب انا كنت اقدر اعملها لوحدي لكن كنت مستني حد يقولي الكلمتين الاخرتين اللي انت قولتهم - اني اقدر اعملهم by manual - يعني عن طريق triggers
جزاكم الله خيرا أخي الحبيب

عن عبد الله بن عمر رضي الله عنهما قال أخذ رسول الله صل الله عليه وسلم بمنكبي فقال كن في الدنيا كأنك غريب أو عابر سبيل


OCP_Logo.gif


#11 repotec

repotec

    عضو

  • الأعضــاء
  • 47 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 04 December 2010 - 06:55 PM

لكي تعم الفائدة
هذا الكود بمثابة Primary key , Foreign key

CREATE TABLE In_item
(in_item_id NUMBER);

CREATE TABLE Out_item
(out_item_id NUMBER);

CREATE TABLE All_item
(all_item_id NUMBER);

CREATE OR REPLACE TRIGGER Item_Id_check
BEFORE INSERT OR UPDATE 
ON All_item
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

DECLARE
 CURSOR InItem_cur IS
                     SELECT 'anything'
                     FROM in_item
                     WHERE in_item_id =  :NEW.all_item_id;
 
 CURSOR OutItem_cur IS
                     SELECT 'anything'
                     FROM Out_item
                     WHERE out_item_id =  :NEW.all_item_id;

 Dummy CHAR(8);

BEGIN
      OPEN InItem_cur;
      FETCH InItem_cur INTO Dummy;
      IF (InItem_cur%NOTFOUND) THEN
         OPEN OutItem_cur;
         FETCH OutItem_cur INTO Dummy;
         IF (OutItem_cur%NOTFOUND) THEN
            RAISE_APPLICATION_ERROR(-20000,'constraint violated - parent not found');
         END IF;      
      END IF;
      CLOSE InItem_cur;
      CLOSE OutItem_cur;
END Item_Id_check;
/
SHOW ERR
CREATE OR REPLACE TRIGGER chk_InItem_del
BEFORE DELETE 
ON in_item
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

DECLARE
  CURSOR ItemId_cur IS
                          SELECT 'anything' 
                          FROM all_item
                          WHERE all_item_id = :OLD.in_item_id;

  Dummy CHAR(8);
BEGIN
   OPEN ItemId_cur;
   FETCH ItemId_cur INTO Dummy;
   IF (ItemId_cur%FOUND) THEN  
      CLOSE ItemId_cur;
      RAISE_APPLICATION_ERROR(-20001, 'constraint violated - child record found');
   END IF;

END chk_initem_del;
/
SHOW ERR


CREATE OR REPLACE TRIGGER chk_OutItem_del
BEFORE DELETE 
ON out_item
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

DECLARE
  CURSOR ItemId_cur IS
                          SELECT 'anything' 
                          FROM all_item
                          WHERE all_item_id = :OLD.out_item_id;

  Dummy CHAR(10);
BEGIN
   OPEN ItemId_cur;
   FETCH ItemId_cur INTO Dummy;
   IF (ItemId_cur%FOUND) THEN  
      CLOSE ItemId_cur;
      RAISE_APPLICATION_ERROR(-20002, 'constraint violated - child record found');
   END IF;

END chk_OutItem_del;
/
SHOW ERR

تم التعديل بواسطة repotec, 04 December 2010 - 06:57 PM.

عن عبد الله بن عمر رضي الله عنهما قال أخذ رسول الله صل الله عليه وسلم بمنكبي فقال كن في الدنيا كأنك غريب أو عابر سبيل


OCP_Logo.gif