سؤال

في الصف ، نحن جميعا 'دراسة' قواعد البيانات و الجميع باستخدام Access.بالملل مع هذا, أنا أحاول أن أفعل ما تبقى من الطبقة به ، ولكن مع الخام أوامر SQL مع الخلية بدلا من استخدام الوصول.

لقد تمكنت من إنشاء قواعد البيانات والجداول ، ولكن الآن كيف يمكنني جعل العلاقة بين اثنين من الجداول ؟

إذا كان لدي جدولين مثل هذا:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

و

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    PRIMARY KEY ( customer_id )
)

كيف يمكنني إنشاء "العلاقة" بين الجداول ؟ أريد كل حساب أن تكون 'تعيين' واحد customer_id (بيان من يملك ذلك).

هل كانت مفيدة؟

المحلول

إذا وك InnoDB الجداول التي يمكن أن تخلق مثل هذا:

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id ), 
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
) ENGINE=INNODB;

وعليك أن تحدد أن الجداول ك InnoDB لمحرك MYISAM لا يدعم المفتاح الخارجي. انظر هنا لمزيد من المعلومات.

نصائح أخرى

كما ehogue قال ضع هذا في إنشاء الجدول

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

بدلا من ذلك, إذا كان لديك الجدول إنشاء استخدام الأمر ALTER TABLE:

ALTER TABLE `accounts`
  ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE;

واحد وسيلة جيدة للبدء في تعلم هذه الأوامر باستخدام الخلية أدوات واجهة المستخدم الرسومية, التي تعطيك أكثر "البصري" واجهة للعمل مع قاعدة البيانات الخاصة بك.الفائدة الحقيقية إلى أن (على طريقة) ، هو أنه بعد تصميم الجدول الخاص بك عن طريق واجهة المستخدم الرسومية ، فإنه يظهر لك SQL هو الذهاب الى تشغيل, ومن ثم يمكنك أن تتعلم من ذلك.

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

and

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
)

How do I create a 'relationship' between the two tables? I want each account to be 'assigned' one customer_id (to indicate who owns it).

وعليك أن تسأل نفسك هل هذا 1-1 العلاقة أو 1 من العديد من العلاقة. وهذا هو، يفعل كل حساب لديهم العملاء وكل زبون لديه حساب. أو لن يكون هناك عملاء دون حسابات. سؤالك يوحي الأخير.

إذا كنت تريد أن يكون لها 1-1 العلاقة صارمة، مجرد دمج الجدولين.

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)

في الحالة الأخرى، والطريقة الصحيحة لإنشاء علاقة بين جدولين هي لإنشاء جدول العلاقة.

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id)
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}

وبعد ذلك إذا كان لديك CUSTOMER_ID وتريد معلومات الحساب، يمكنك الانضمام على customersaccounts والحسابات:

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;

ونظرا لفهرسة هذه سوف تكون سريعة تمام الوضوح.

ويمكنك أيضا إنشاء VIEW الذي يمنحك تأثير الجدول customersaccounts جنبا إلى جنب مع إبقائها منفصلة

CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca
        INNER JOIN accounts a ON ca.account_id=a.account_id
        INNER JOIN customers c ON ca.customer_id=c.customer_id;

وإضافة على تعليق من ehogue، يجب عليك التأكد من حجم مفاتيح على كل مباراة الجداول. بدلا من

customer_id INT( 4 ) NOT NULL ,

وجعله

customer_id INT( 10 ) NOT NULL ,

ووالتأكد من العمود الباحث في الجدول العملاء هو كثافة العمليات (10) أيضا.

وبعض محركات الخلية تدعم المفاتيح الخارجية. على سبيل المثال، يمكن ك InnoDB وضع قيود على أساس المفاتيح الخارجية. إذا حاولت حذف إدخال في جدول واحد لديه المعالين في بلد آخر، ستفشل الحذف.

إذا كنت تستخدم نوع الجدول في الخلية، مثل MYISAM، لا يدعم المفاتيح الخارجية، لا ربط الجداول في أي مكان باستثناء الرسوم البيانية واستفساراتكم.

وعلى سبيل المثال، في استعلام ربط جدولين في بيان حدد مع انضمام:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);

وهنا زوجين من الموارد التي من شأنها أن تساعد على البدء: HTTP: // شبكة الاتصالات العالمية. anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase و <لأ href = "http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net- 8561 "يختلط =" نوفولو "> http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

وأيضا كما قال آخرون، استخدام واجهة المستخدم الرسومية - محاولة تحميل وتثبيت XAMPP (أو امب) التي تعمل خادم البرمجيات (أباتشي و MySQL) على جهاز الكمبيوتر الخاص بك. ثم عندما انتقل إلى // المضيف المحلي في المتصفح، اختر بريس للبدء في العمل مع قاعدة بيانات الخلية بصريا. وكما ذكر أعلاه، وتستخدم ك InnoDB للسماح لك لجعل العلاقات كما طلبتم. يجعل من أكوام السهل أن نرى ما تفعلونه مع جداول قاعدة البيانات. فقط تذكر لوقف الخدمات اباتشي والخلية عند الانتهاء - هذه يمكن أن تفتح المنافذ التي يمكن أن يعرضك لتقطيع / التهديدات الخبيثة

واحدة من القواعد التي يجب أن نعرفه هو أن العمود الجدول الذي تريد الرجوع إلى أن يكون مع نفس نوع البيانات الجدول المراجع. 2 إذا كنت ترغب في استخدام الخلية لديك لاستخدام ك InnoDB المحرك لأنه وفقا لسؤالك هذا هو المحرك الذي يدعم ما تريد تحقيقه في الخلية.

ورفع الصوت عاليا هو رمز محاولة ذلك على الرغم من أن أول الناس للإجابة على هذا السؤال هم 100٪ توفير الإجابات كبيرة ويرجى النظر في كل منهم.

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY (account_id)
)ENGINE=InnoDB;

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
     PRIMARY KEY ( account_id ), 
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
)ENGINE=InnoDB; 
create table departement(
    dep_id      int primary key auto_increment,
    dep_name    varchar(100) not null,
    dep_descriptin      text,
    dep_photo       varchar(100) not null,
    dep_video       varchar(300) not null
);

create table newsfeeds(
    news_id         int primary key auto_increment,
    news_title      varchar(200) not null,
    news_description    text,
    news_photo          varchar(300) ,
    news_date           varchar(30) not null,
    news_video          varchar(300),
    news_comment        varchar(200),
    news_departement    int foreign key(dep_id) references departement(dep_id)
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top