在课堂上,我们都在“学习”数据库,每个人都在使用Access。对此感到厌烦,我正在尝试做其他类正在做的事情,但使用MySQL的原始SQL命令而不是使用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(以表明谁拥有它)。
答案 0 :(得分:91)
如果表格是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了解更多信息。
答案 1 :(得分:72)
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的方法)是,在通过GUI设计表之后,它会向您显示它将要运行的SQL,因此您可以从中学习。
答案 2 :(得分:11)
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,
)
在另一种情况下,在两个表之间创建关系的正确方法是创建关系表。
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并想要帐户信息,那么您就加入了客户帐户和帐户:
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;
答案 3 :(得分:9)
通过ehogue添加注释,您应该使两个表上的键的大小匹配。而不是
customer_id INT( 4 ) NOT NULL ,
制作
customer_id INT( 10 ) NOT NULL ,
并确保customers表中的int列也是int(10)。
答案 4 :(得分:6)
某些MySQL引擎支持外键。例如,InnoDB可以基于外键建立约束。如果您尝试删除一个表中具有依赖项的条目,则删除将失败。
如果您在MySQL中使用的表格类型(例如MyISAM)不支持外键,则除了图表和查询之外,您不会将表格链接到任何地方。
例如,在查询中,您可以使用连接链接select语句中的两个表:
SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
答案 5 :(得分:2)
以下是一些有助于入门的资源:http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase和http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561
正如其他人所说,使用GUI - 尝试下载并安装运行服务器软件(Apache和mySQL)的Xampp(或Wamp)。 然后,当您在浏览器中导航到// localhost时,选择PHPMyAdmin以开始直观地使用mySQL数据库。如上所述,使用innoDB允许您按照要求建立关系。使堆栈更容易看到您对数据库表执行的操作。只需记住在完成后停止Apache和mySQL服务 - 这些可能会打开端口,这会使您面临黑客/恶意威胁。
答案 6 :(得分:1)
您必须知道的一条规则是您要引用的表列必须与数据类型相同 引用表。 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;
答案 7 :(得分:0)
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)
);