如何在MySQL中创build关系
在课堂上,我们都是“学习”数据库,每个人都在使用Access。 无聊的,我正在尝试做其他的课程,但用MySQL的原始SQL命令而不是使用Access。
我已经设法创build数据库和表,但现在我怎么做两个表之间的关系?
如果我有这样的两个表:
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, )
我如何在两个表格之间创build一个“关系”? 我希望每个账户都被分配一个customer_id(表明谁拥有它)。
如果表是innodb,你可以像这样创build它:
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引擎不支持外键。 在这里寻找更多的信息。
正如ehogue所说,把这个放在你的CREATE TABLE中
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
或者,如果您已经创build了表,请使用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工具 ,它为您提供了一个更“可视化”的界面来处理数据库。 真正的好处(通过Access的方法)是,通过GUIdevise你的表后,它显示你将要运行的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的关系,只需合并两个表。
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, )
在另一种情况下,在两个表之间创build关系的正确方法是创build一个关系表。
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并且想要账户信息,你可以joincustomersaccounts和accounts:
SELECT a.* FROM customersaccounts ca INNER JOIN accounts a ca.account_id=a.account_id AND ca.customer_id=mycustomerid;
由于索引,这将是盲目快速。
您也可以创build一个VIEW,它可以让您分开组合customersccounts表的效果
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 ,
并确保customers表中的int列也是int(10)。
某些MySQL引擎支持外键。 例如,InnoDB可以根据外键build立约束。 如果您尝试删除在另一个具有依赖项的表中的条目,则删除将失败。
如果您在MySQL中使用的表types(如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,数据库的关系-网8561
也正如其他人所说,使用GUI – 尝试下载并安装在您的计算机上运行服务器软件(Apache和mySQL)的Xampp(或Wamp)。 然后,当您在浏览器中导航到// localhost时,selectPHPMyAdmin以可视方式开始使用mySQL数据库。 如上所述,使用innoDB允许你按照你的要求build立关系。 使它更容易看到你在做什么与数据库表。 只要记住在完成时停止Apache和mySQL服务 – 这些可以打开端口,这可能会暴露您的黑客/恶意威胁。
您必须知道的规则之一是您要引用的表列必须使用与引用表相同的数据types。 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;