8.3.7 - mysql 表之间关系

如何找出两张表之间的关系

分析步骤:
#1、先站在左表的角度去找
是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)

#2、再站在右表的角度去找
是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)

#3、总结:
#多对一:
如果只有步骤1成立,则是左表多对一右表
如果只有步骤2成立,则是右表多对一左表

#多对多
如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系

#一对一:
如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

建立表之间的关系

#一对多或称为多对一
三张表:出版社,作者信息,书

一对多(或多对一):一个出版社可以出版多本书

关联方式:foreign key
两张表之间的关系
1. 多对一
   出版社   书(press_id int,foreign key (preess_id) references press(id))
2. 多对多
3. 一对一

例子
#一对多或称为多对一
三张表:出版社,作者信息,书
一对多(或多对一):一个出版社可以出版多本书
关联方式:foreign key
=====================多对一=====================
create table press(
id int primary key auto_increment,
name varchar(20)
);

create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);
insert into press(name) values
(‘机械工业出版社‘),
(‘人民出版社‘),
(‘南京出版社‘)
;

insert into book(name,press_id) values
(‘计算机基础‘,1),
(‘python入门‘,2),
(‘mysql‘,2),
(‘机械原理‘,3),
(‘十万个为什么‘,2),
(‘社会科学‘,3)
;

    # 操作过程
    mysql> create table press(
        -> id int primary key auto_increment,
        -> name varchar(20)
        -> );
    Query OK, 0 rows affected (0.03 sec)

    mysql>
    mysql> create table book(
        -> id int primary key auto_increment,
        -> name varchar(20),
        -> press_id int not null,
        -> foreign key(press_id) references press(id)
        -> on delete cascade
        -> on update cascade
        -> );
    Query OK, 0 rows affected (0.03 sec)

    mysql> insert into press(name) values
        -> (‘机械工业出版社‘),
        -> (‘人民出版社‘),
        -> (‘南京出版社‘)
        -> ;
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0

    mysql>
    mysql> insert into book(name,press_id) values
        -> (‘计算机基础‘,1),
        -> (‘python入门‘,2),
        -> (‘mysql‘,2),
        -> (‘机械原理‘,3),
        -> (‘十万个为什么‘,2),
        -> (‘社会科学‘,3)
        -> ;
    Query OK, 6 rows affected (0.01 sec)
    Records: 6  Duplicates: 0  Warnings: 0

    mysql> desc press;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(20) | YES  |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)

    mysql> select * from book;
    +----+--------------------+----------+
    | id | name               | press_id |
    +----+--------------------+----------+
    |  1 | 计算机基础         |        1 |
    |  2 | python入门         |        2 |
    |  3 | mysql              |        2 |
    |  4 | 机械原理           |        3 |
    |  5 | 十万个为什么       |        2 |
    |  6 | 社会科学           |        3 |
    +----+--------------------+----------+
    6 rows in set (0.00 sec)

    mysql> select * from press;
    +----+-----------------------+
    | id | name                  |
    +----+-----------------------+
    |  1 | 机械工业出版社        |
    |  2 | 人民出版社            |
    |  3 | 南京出版社            |
    +----+-----------------------+
    3 rows in set (0.00 sec)

原文地址:https://www.cnblogs.com/caimengzhi/p/8555203.html

时间: 2024-10-09 14:10:12

8.3.7 - mysql 表之间关系的相关文章

【转】Oracle - 数据库的实例、表空间、用户、表之间关系

[转]Oracle - 数据库的实例.表空间.用户.表之间关系 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区. 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘

Oracle - 数据库的实例、表空间、用户、表之间关系

完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区. 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件.Oracle有一个很大的内存快,成为全局区(SGA

表与表之间关系回顾

------------------siwuxie095 表与表之间关系回顾 1.一对多 (1) 1)场景:分类和商品的关系 2)描述:一个分类里面有多个商品,一个商品只能属于一个分类 (2) 1)场景:客户和联系人的关系 2)描述:一个客户里面有多个联系人,一个联系人只能属于一个客户 注意:这里的客户是公司级的,即 公司,联系人 即 公司里的员工,实 际上就是公司和员工的关系 (3)一对多建表:通过外键建立关系 在多的那一方创建字段作为外键,指向一的那一方的主键 客户: cid cname 1

ACCESS 实例学生信息管理表之间关系图

ACCESS 实例学生信息管理表之间关系图 汉语编程1 汉语编程2 汉语编程3 原文地址:http://blog.51cto.com/13172026/2164352

mysql 建立表之间关系 练习 1

练习:账号信息表,用户组,主机表,主机组 #用户表 mysql> create table user( id int not null unique auto_increment, username varchar(50) not null, password varchar(50) not null, primary key(username,password)); Query OK, 0 rows affected (0.12 sec) 插入用户信息 mysql> insert into

mysql 建立表之间关系 练习 2

创建数据库db6 create database db6 charset=utf8; user db6; # 创建班级表 mysql> create table class(cid int primary key auto_increment,caption varchar(50) not null unique); Query OK, 0 rows affected (0.15 sec) mysql> select * from class; Empty set (0.00 sec) mys

mysql表之间的复制,同数据库 和不同数据库

Mysql的语句 我们可以先把test下的t1表的结构导出来,然后新建立一个test1.t1表. 执行下面语句 insert into test1.t1 select * from test.t1 limit 2 (limit限制条数) 如果在一个数据库中就是 insert into t1  select  * from t2   limit 2 如果表结构不一样的两张表,可以考虑..参考下面的语句 INSERT into db_ds_edu.t_exam_student(stu_id,stu_

[转]Oracle - 数据库的实例、表空间、用户、表之间关系

本文转自:http://www.cnblogs.com/adforce/p/3312252.html 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区. 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个

Django数据库的查看、删除,创建多张表并建立表之间关系

配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': {