Как создать отношения в MySQL
в классе мы все "изучаем" базы данных, и все используют доступ. Скучно с этим, я пытаюсь делать то, что делает остальная часть класса, но с необработанными командами 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,
)
Как создать "отношения" между двумя столы? Я хочу, чтобы каждой учетной записи был "назначен" один customer_id (чтобы указать, кто им владеет).
8 ответов:
Если таблицы 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 не поддерживает внешний ключ. Смотри здесь для получения дополнительной информации.
Как сказал эхог, поместите это в свою таблицу создания
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, что дает вам более "визуальный" интерфейс для работы с вашей базой данных. Реальная выгода от этого (по методу доступа) заключается в том, что после проектирования вашей таблицы через графический интерфейс он показывает вам 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 с присоединяйтесь:
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 services, когда закончите - они могут открыть порты, которые могут подвергнуть вас взлому/вредоносным угрозам.
одно из правил, которое вы должны знать, заключается в том, что столбец таблицы, на который вы хотите ссылаться, должен иметь тот же тип данных, что и Таблица ссылок . 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;
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) );
Comments