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

كيف اعمل view من ثلاثة جداول في postgresql

مضحي Modhy

السؤال

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

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...