108

在课堂上,我们都在“学习”数据库,每个人都在使用 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(以指示谁拥有它)。

4

8 回答 8

117

如果表是 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 引擎不支持外键。在这里查看更多信息。

于 2008-11-04T00:32:48.270 回答
89

正如 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 工具,它为您提供了一个更“可视化”的界面来处理您的数据库。这样做的真正好处(通过 Access 的方法)是,在通过 GUI 设计表之后,它会向您显示它将运行的 SQL,因此您可以从中学习。

于 2008-11-04T00:37:52.223 回答
19
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 并想要帐户信息,则加入 customersaccounts 和帐户:

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;
于 2015-03-06T01:21:51.983 回答
11

通过 ehogue 添加到评论中,您应该使两个表上的键的大小匹配。而不是

customer_id INT( 4 ) NOT NULL ,

做了

customer_id INT( 10 ) NOT NULL ,

并确保客户表中的 int 列也是 int(10) 。

于 2008-11-04T00:36:10.650 回答
9

某些 MySQL 引擎支持外键。例如,InnoDB 可以基于外键建立约束。如果您尝试删除一个表中的条目,而该条目在另一个表中有依赖项,则删除将失败。

如果您在 MySQL 中使用不支持外键的表类型,例如 MyISAM,则除了图表和查询之外,您不会将表链接到任何地方。

例如,在查询中,您使用连接将 select 语句中的两个表链接起来:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
于 2008-11-04T01:02:30.503 回答
2

以下是一些有助于入门的资源:http ://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase和http://code.tutsplus.com/articles/sql-for-beginners-part- 3-数据库关系--net-8561

也正如其他人所说,使用 GUI - 尝试下载并安装在您的计算机上运行服务器软件(Apache 和 mySQL)的 Xampp(或 Wamp)。然后,当您在浏览器中导航到 //localhost 时,选择 PHPMyAdmin 以开始可视化地使用 mySQL 数据库。如上所述,使用 innoDB 允许您按照您的要求建立关系。使查看您对数据库表所做的事情变得更加容易。请记住在完成后停止 Apache 和 mySQL 服务 - 这些可能会打开端口,从而使您面临黑客/恶意威胁。

于 2014-05-21T06:37:34.857 回答
1

您必须知道的规则之一是您要引用的表列必须与引用表具有相同的数据类型。2 如果您决定使用 mysql ,则必须使用 InnoDB Engine 因为根据您的问题,该引擎支持您想要在 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; 
于 2013-01-26T10:30:49.323 回答
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)
);
于 2018-09-16T05:13:54.917 回答