Как создать отношения в MySQL
-
06-07-2019 - |
Вопрос
На занятиях мы все "изучаем" базы данных, и все используют 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 (чтобы указать, кому она принадлежит).
Решение
Если таблицы являются 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 не поддерживает внешний ключ.Смотри здесь для получения дополнительной информации.
Другие советы
как сказал эхог, поместите это в свою таблицу СОЗДАНИЯ
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) заключается в том, что после разработки вашей таблицы с помощью графического интерфейса она показывает вам 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;
Из-за индексации это будет невероятно быстро.
Вы также могли бы создать представление, которое дает вам эффект объединенной таблицы 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 ,
и убедитесь, что ваш столбец int в таблице customers также равен int(10).
Некоторые движки MySQL поддерживают внешние ключи.Например, InnoDB может устанавливать ограничения на основе внешних ключей.Если вы попытаетесь удалить запись в одной таблице, которая имеет зависимые элементы в другой, удаление завершится неудачей.
Если вы используете табличный тип в MySQL, такой как MyISAM, который не поддерживает внешние ключи, вы нигде не связываете таблицы, кроме своих диаграмм и запросов.
Например, в запросе вы связываете две таблицы в операторе select с помощью join:
SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
Вот пара ресурсов, которые помогут начать: 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, чтобы позволить вам устанавливать связи в соответствии с вашими запросами.Упрощает просмотр кучи того, что вы делаете с таблицами базы данных.Просто не забудьте ОСТАНОВИТЬ службы Apache и MySQL по завершении - они могут открыть порты, которые могут подвергнуть вас взлому / вредоносным угрозам.
Одно из правил, которое вы должны знать, заключается в том, что столбец таблицы, на который вы хотите сослаться, должен иметь тот же тип данных, что и Ссылающаяся таблица .2 если вы решите использовать mysql , вы должны использовать движок InnoDB , потому что, согласно вашему вопросу, это движок, который поддерживает то, чего вы хотите достичь в 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;
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)
);