Як створити відносини в MySQL


96

У класі ми всі "вивчаємо" бази даних, і всі використовують Access. Нудно з цим, я намагаюся робити те, що робить решта класу, але за допомогою необроблених команд SQL із MySQL замість використання Access.

Мені вдалося створити бази даних та таблиці, але тепер, як я можу скласти зв’язок між двома таблицями?

Якщо у мене є дві такі таблиці:

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 )
)

Як створити "співвідношення" між двома таблицями? Я хочу, щоб кожному обліковому запису було присвоєно по одному клієнту (вказати, хто йому належить).


48
"Я відхиляюсь вивчати доступ, я вивчу справжній движок бази даних: MySQL" Це дух! Вітаємо = D
Метафаніель

2
Зауважте, що закордонні ключові обмеження не реалізують відносини, вони реалізують цілісність. Асоціація між account_id та customer_id у таблиці рахунків реалізує відносини між відповідними суб'єктами.
reaanb

1
"Це дух!", Якщо це mysql з InnoDB, а не MyISAM. Також postgreqsl має кілька цікавих функцій над MySQL, які варто переглянути.
jgmjgm

Відповіді:


102

Якщо таблиці 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 не підтримує зовнішній ключ. Подивіться тут для отримання додаткової інформації.


Я бачив в своїй статті, що немає необхідності вказувати ENGINE = InnoDB положення , якщо InnoDB визначається як механізм зберігання даних за замовчуванням, можна перевірити з допомогою команди (MySQL> SELECT @@ default_storage_engine;)
Arun

80

як сказав 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;

Одним хорошим способом розпочати вивчення цих команд є використання інструментів графічного інтерфейсу MySQL , які надають вам більш «візуальний» інтерфейс для роботи з вашою базою даних. Реальна вигода від цього (над методом Access) полягає в тому, що після проектування таблиці за допомогою GUI він показує вам, що SQL буде запускатися, і, отже, ви можете дізнатися з цього.


3
Ваша відповідь - найкраще рішення
Омар,

14
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 і вам потрібна інформація про обліковий запис, ви приєднуєтесь до акаунтів клієнтів та акаунтів:

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

Через індексацію це буде сліпуче швидко.

Ви також можете створити ПЕРЕГЛЯД, який надає вам ефект комбінованої таблиці рахунків клієнтів, зберігаючи їх окремо

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;

1
Я думаю, ви ca.не мали на увазі ac.(3 місця).
Еліптичний вигляд

ви писали PRIMARY KEY (customer_id, account_id)без коми після неї
theonlygusti

11

Додаючи до коментаря ehogue, ви повинні зрівняти розмір клавіш на обох таблицях. Швидше ніж

customer_id INT( 4 ) NOT NULL ,

Зроби це

customer_id INT( 10 ) NOT NULL ,

і переконайтеся, що ваш стовпець int у таблиці клієнтів також є int (10).


7

Деякі двигуни MySQL підтримують зовнішні ключі. Наприклад, InnoDB може встановлювати обмеження на основі зовнішніх ключів. Якщо ви спробуєте видалити запис в одній таблиці, який містить залежні особи в іншій, видалення не вдасться.

Якщо ви використовуєте тип таблиці в MySQL, наприклад MyISAM, який не підтримує сторонні ключі, ви не зв'язуєте таблиці ніде, крім діаграм і запитів.

Наприклад, у запиті ви пов'язуєте дві таблиці у вибраному операторі з приєднанням:

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

2

Ось кілька ресурсів, які допоможуть розпочати роботу: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase та http://code.tutsplus.com/articles/sql-for-beginners-part- 3-бази даних-net-8561

Також, як казали інші, використовуйте графічний інтерфейс - спробуйте завантажити та встановити Xampp (або Wamp), який запускає серверне програмне забезпечення (Apache та mySQL) на вашому комп'ютері. Потім, перейшовши до // localhost у браузері, виберіть PHPMyAdmin, щоб візуально розпочати роботу з базою даних mySQL. Як вже згадувалося вище, використовується innoDB, щоб дозволити вам встановлювати стосунки за вашим запитом. Це спрощує купу, щоб побачити, що ви робите з таблицями бази даних. Просто не забудьте ЗУПИНИТИ служби Apache та mySQL, коли закінчите - вони можуть відкрити порти, які можуть піддавати вас злому / зловмисним загрозам.


Якщо ви встановили apache і mysql для обслуговування лише локальних запитів, вам не потрібно їх зупиняти. Крім того, що користувачі повинні мати принаймні встановлений програмний брандмауер, якщо встановлюють такі види послуг. З огляду на це, багато домашні маршрутизатори мають вбудований в них брандмауер, тому порти все одно не повинні бути відкритими, якщо їх не відкрив хтось, хто має доступ до маршрутизатора.
Кріс

1

Одне з правил, яке ви повинні знати, полягає в тому, що стовпець таблиці, на який ви хочете посилатися, повинен мати той самий тип даних, що і таблиця посилань. 2 якщо ви вирішили використовувати mysql, вам доведеться використовувати InnoDB Engine, оскільки відповідно до вашого запитання це движок, який підтримує те, чого ви хочете досягти в mysql.

Нижче наведено код, спробуйте, хоча перші, хто відповів на це питання, вони на 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; 

0
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)
);

Будь-ласка, надайте пояснення щодо наданої вами схеми.
samabcde
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.