اذهب إلى المحتوى

السؤال

نشر

لدي هذه الجدول

table 1

CREATE TABLE users (
    id_user uuid DEFAULT uuid_generate_v4(),
    email character varying(255) UNIQUE,
    createdAtU timestamptz,
    updatedAtU timestamptz,
    PRIMARY KEY (id_user)
);

table 2

CREATE TABLE usersInfo (
    id_user uuid,
    fullname character varying(255),
    createdAtI timestamptz,
    updatedAtI timestamptz,
    PRIMARY KEY (id_user)
);

table 3

CREATE TABLE usersCode (
    id_user uuid UNIQUE,
    code integer,
    createdAt timestamptz,
    updatedAt timestamptz,
    PRIMARY KEY (id_user)
);

 

كيف اعمل View يجمع البيانات في مكان واحد علماً ان id_user متساوي في كل الجداول بحيث اول ما انشىء مستخدم جديد يتم انشاء له صفوف مقابلة في الجداول الاخرى بنفس id

Recommended Posts

  • 1
نشر

يمكنك انشاء View لتمثل جدول جديد (وهمي) يجمع كل البيانات ويخفي البنية الحقيقية للجداول ويجعل عبارة الاستعلام اقصر واسهل كالتالي

CREATE VIEW usersView AS (
  SELECT u.id_user AS id_user, u.email AS email, u.createdAtU AS createdAtU, u.updatedAtU AS updatedAtU,
		 ui.fullname AS fullname, ui.createdAtI AS createdAtI, ui.updatedAtI AS updatedAtI,
		 uc.code AS code, uc.createdAt AS createdAt, uc.updatedAt AS updatedAt 
  FROM users u
  LEFT JOIN usersInfo ui ON u.id_user = ui.id_user
  LEFT JOIN usersCode uc ON u.id_user = uc.id_user
);

وتستعلم عن بيانات مستخدم ما كالتالي

SELECT * FROM usersView WHERE user_id = 5

لادخال بيانات في عدة جداول معا تتعامل مع ال View كانها جدول حقيقي   

INSERT INTO usersView (fullname, email, code) Values ('Full Name', 'email@example.com', 'AX5');

 

  • 0
نشر
بتاريخ 2 ساعات قال مضحي Modhy:

@Hassan Hedr

في حال اضفت بيانات من خلال userView هل يتم اضافة id في كل الجداول تلقائياً ؟

علماً انه تلقائي فقط في الجدول الاول

لا لن يضاف ستحتاج لذكره صراحة في تعريف ال view وذكره في استعلام الادخال في insert كالتالي

CREATE VIEW usersView AS (
  SELECT u.id_user AS id_user, u.email AS email, u.createdAtU AS createdAtU, u.updatedAtU AS updatedAtU,
		 ui.id_user AS ui_id_user, ui.fullname AS fullname, ui.createdAtI AS createdAtI, ui.updatedAtI AS updatedAtI,
		 uc.id_user AS uc_id_user, uc.code AS code, uc.createdAt AS createdAt, uc.updatedAt AS updatedAt 
  FROM users u
  LEFT JOIN usersInfo ui ON u.id_user = ui.id_user
  LEFT JOIN usersCode uc ON u.id_user = uc.id_user
);

وعند الادخال يجب ذكر ال id لكل جدول

اذا واجهت مشاكل في الإدخال جرب أحد الطريقتين

  • تبديل LEFT JOIN بـ INNER JOIN
  • تقسم عمليات الادخال بحيث في كل مرة تدخل عناصر متعلقة بجدول واحد فقط (في هذه الحالة انصح استخدام الView فقط كبديل عن الاستعلام SELECT وليس للادخال)
    INSERT INTO usersView (`email`) VALUES ('email@example.com');
    INSERT INTO usersView (`ui_id_user`, `fullname`) VALUES (1, 'Name');
    INSERT INTO usersView (`uc_id_user`, `code`) VALUES (1, 'XC5');

     

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...