Как создавать отношения в MySQL

В классе мы все "изучаем" базы данных, и все используют 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 )
)

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

Ответ 1

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

Ответ 2

как сказал ehogue, поместите это в свой CREATE TABLE

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 GUI Tools, который дает вам более "визуальный" интерфейс для работы с вашими база данных. Настоящая выгода от этого метода (над методом Access) заключается в том, что после проектирования таблицы через графический интерфейс он показывает вам, какой SQL он будет запускаться, и, следовательно, вы можете узнать из этого.

Ответ 3

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
}

Затем, если у вас есть client_id и вы хотите получить информацию об учетной записи, вы присоединяетесь к клиентам учетных записей и учетных записей:

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

Из-за индексации это будет ослепительно быстрым.

Вы также можете создать VIEW, который дает эффект объединенной таблицы clientsaccounts, сохраняя при этом их отдельные

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;

Ответ 4

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

customer_id INT( 4 ) NOT NULL ,

сделать это

customer_id INT( 10 ) NOT NULL ,

и убедитесь, что ваш столбец int в таблице Customers также является int (10).

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

Одно из правил, которые вы должны знать, это то, что столбец таблицы, который вы хотите ссылаться, должен иметь тот же тип данных, что и Таблица ссылок. 2, если вы решили использовать mysql, вам нужно использовать движок InnoDB, потому что, согласно вашему вопросу, это движок, который поддерживает то, что вы хотите достичь в 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; 

Ответ 8

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