2008-11-04 6 views
82

В классе мы все «изучаем» базы данных, и каждый использует Access. Скучно с этим, я пытаюсь сделать то, что делает остальная часть класса, но с сырыми командами SQL с MySQL вместо использования Access.Как создать отношения в MySQL

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

Если у меня есть две таблицы, как это:

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

Как создать 'отношения' между двумя таблицами? Я хочу, чтобы каждая учетная запись была «назначена» one customer_id (чтобы указать, кто ее владеет).

+26

«Я ОТКАЗАТЬСЯ для изучения доступа, я буду изучать двигатель РЕАЛ базы данных: MySQL» Это дух! Поздравляем = D – Metafaniel 2015-08-24 18:10:05

+1

Обратите внимание, что ограничения внешнего ключа не реализуют отношения, они реализуют целостность. Связь между account_id и customer_id в таблице учетных записей реализует взаимосвязь между соответствующими объектами. – reaanb 2015-10-05 18:25:05

+1

«Это дух!», Если это mysql с InnoDB, а не MyISAM. Также postgreqsl имеет несколько интересных функций над MySQL, на которые стоит обратить внимание. – jgmjgm 2016-08-23 15:53:04

ответ

82

Если таблицы 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 двигатель не поддерживает внешний ключ. Посмотрите here для получения дополнительной информации.

9

Добавляя к комментарию ehogue, вы должны сделать размер ключей на обеих таблицах. Вместо

customer_id INT(4) NOT NULL , 

сделать его

customer_id INT(10) NOT NULL , 

и убедитесь, что ИНТ столбец в таблице клиентов является INT (10) также.

+1

Хорошо, я не видел размеры полей. – 2008-11-04 00:38:53

62

, как ehogue сказал, это в вашем CREATE TABLE

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

в качестве альтернативы, если у вас уже есть таблица, созданная, используйте команду TABLE ALTER:

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

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

6

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

Если вы используете тип таблицы в MySQL, такой как MyISAM, который не поддерживает внешние ключи, вы не связываете таблицы нигде, кроме диаграмм и запросов.

Например, в запросе вы связать две таблицы в операторе отбора с объединением:

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

Одно из правил, которые вы должны знать, что столбец таблицы вы хотите, чтобы ссылки на должен быть с тем же типом данных, что и Таблица ссылок. 2, если вы решили использовать mysql, вам нужно использовать InnoDB Engine, потому что в соответствии с вашим вопросом это движок, который поддерживает то, что вы хотите достичь в mysql.

Bellow это код, попробуйте, хотя первые люди, чтобы ответить на этот вопрос , они на 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; 
2

Вот несколько ресурсов, которые помогут начать работу: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase и http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

Кроме того, как другие говорили, использовать GUI - попробуйте загрузить и установить Xampp (или WAMP), которые выполняются серверные программное обеспечение (Apache и mySQL) на вашем компьютере. Затем, когда вы переходите к // localhost в браузере, выберите PHPMyAdmin, чтобы визуально начать работу с базой данных mySQL. Как упоминалось выше, используется innoDB, чтобы вы могли устанавливать отношения по мере необходимости. Делает кучи легче видеть, что вы делаете с таблицами базы данных. Просто запомните STOP Apache и mySQL-сервисы, когда они закончены - они могут открывать порты, которые могут подвергнуть вас взломам/вредоносным угрозам.

10
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; 

 Смежные вопросы

  • Нет связанных вопросов^_^