外键、多表查询,Navicat可视化软件

本文详细介绍了数据库中的外键概念,如何识别不同类型的表间关系(一对一、一对多、多对多),以及多表查询的两种方法——子查询和连表查询(内连接、左连接、右连接)。还提供了创建表结构实例来展示关联方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、外键

关键字:foreign key

1. 表与表之间的关系

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

分析步骤:

        1、先站在左表的角度去找

                判断左表的一条记录是够能够对应右表中的多条记录,如果能,左表的一个字段 foreign key 右表的一个字段

        2、 再站在右表的角度去找

                判断右表中的一条记录是否能够对应左表中的多条记录,如果能,右表的一个字段foreign key 左表的一个字段

 

总结:

        一对多:如果只有步骤一成立,步骤二不成立或步骤二成立,步骤一不成立,那就是一对多关系


        多对多:如果步骤1和步骤2同时成立,则证明这两张表是多对多关系


        一对一:如果步骤1和步骤2都不成立,而左表中的一条数据对应右表中的一条数据,那两表就是一对一的关系

2. 建立表与表之间关系的注意事项

1. 创建表示先创建被关联的的表(没有外键的表),然后在创建关联的表

2. 插入新数据时,应该确定被关联表中有数据

3. 在插入新数据的时候,外键字段只能填写被关联表中已经存在的数据

4. 在修改和删除被关联表中的数据时,无法直接操作,要想数据之间自动修改和删除需要添加额外的设置

3. 建立表与表之间的关系

 第一种:

一对多:关联方式:foreign key

create table dep(id int primary key auto_increment,name varchar(32));

create table emp(id int primary key auto_increment,name varchar(32),age int,dep_id int,foreign key(dep_id) references dep(id) on update cascade on delete cascade);

insert into dep(name) values('技术部'),('人事部');
insert into emp(name,age,dep_id) values('张三',18,1),('李四',19,2);

 第二种:

  多对多:关联方式:foreign key + 一张表

第三种:

一对一:关联方式:foreign key + unique

create table user(id int primary key,name varchar(32));

create yable userinfo(id int primary key auto_increment,qq int,email int,user_id int unique,foreign key(user_id) references user(id) on update cascade on delete cascade);

insert into user(name) values('张三'),('李四');

insert into userinfo(qq,email,user_id) values(1211111,1111111,2),(11218476,19894765,4);

二、多表查询

 方法1:子查询(分布操作)

        子查询:一条SQL语句的执行结果作为另一条SQL语句的执行条件

例:select*from dep where id = (select dep_id from emp where name = 'kevin');


方法2:连表查询(重点)

连表查询:把多张有关系的表链接成一张巨大的虚拟表,链接出来的虚拟表不是真实存在的,它在内存中存着,然后按照单表查询

 

专业的连表语法:

        inner join :内连接,查询的是两张表中都有的数据

        left join :左连接,以左表为基准,查询左表中的所有数据,右表没有的数据,用NULL连接

        right join :右连接,以右表为基准,查询右表中的所有数据,左表没有的数据,用NULL连接

        union :连接两个SQL语句的结果

 

    例句:select*from dep left join emp on emp.id = dep.id;

                union

              select*from dep right join left on emp.id=dep.id;

 

 连表查询可以查看多张表,不止两张表

<think>嗯,用户想在Navicat中创建和管理约束。首先,我需要回忆一下Navicat的操作步骤。根据之前看的引用资料,比如引用[3]详细描述了如何通过设计来添加。用户需要右点击目标,选择设计,然后找到选项卡。接下来,设置栏位、参考、参考栏位,以及删除和更新时的行为。 然后,用户可能还需要知道不同的策略,比如CASCADE或SET NULL,这些在引用[4]里有说明。应该解释每种行为的作用,比如级联更新或删除时设为空。另,用户可能会遇到问题,比如约束不生效,这时候需要检查引擎是否是InnoDB,或者字段类型是否匹配,引用[2]中的例子用了ALTER TABLE语句,可能涉及到SQL语句的确认。 还要注意,Navicat在保存时会自动生成名称,如果用户没填的话,如引用[1]提到。管理现有可能需要通过设计界面查看或修改,或者直接使用SQL语句。此,用户可能不知道的作用,需要简单说明的作用是保持数据完整性,引用[4]的开头部分有提到。 需要分步骤回答,先讲创建步骤,再讲管理方法,最后注意事项和常见问题。这样结构清晰,用户能一步步跟着操作。可能还需要生成相关问题,比如的作用、不同策略的区别、如何处理错误等。要确保回答准确,引用正确的资料,比如在解释删除行为时引用[4]中的分类。</think>### 在 Navicat 中创建和管理约束的步骤 #### **一、创建约束** 1. **打开设计界面** - 在 Navicat 中右点击需要添加的子(如 `t_student`),选择 **“设计”**[^3]。 2. **进入设置** - 在设计界面中,切换到 **“”** 选项卡,点击 **“+”** 按钮添加新[^3]。 3. **配置属性** - **栏位**:选择子中需要关联的字段(如 `classno`)。 - **参考**:选择父(如 `t_class`)。 - **参考栏位**:选择父中被关联的字段(如 `cno`)。 - **删除时** 和 **更新时**:设置策略(如 `CASCADE` 或 `SET NULL`)[^4]。 - **名**:可留空,Navicat 会自动生成名称[^1]。 4. **保存配置** - 点击 **“保存”** 按钮完成约束的创建[^1]。 #### **二、管理约束** 1. **修改策略** - 在设计界面的 **“”** 选项卡中,选择已有,修改其删除/更新行为(如从 `NO ACTION` 改为 `CASCADE`)[^4]。 2. **删除约束** - 在中选择目标,点击 **“-”** 按钮移除。 3. **通过 SQL 语句管理** - 可直接执行 SQL 命令,例如: ```sql ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY (classno) REFERENCES t_class(cno) ON UPDATE CASCADE ON DELETE SET NULL; ``` 此命令添加了一个级联更新、删除置空的约束[^2]。 #### **三、关注意事项** 1. **存储引擎要求** - 仅 **InnoDB** 引擎支持约束,需确保的存储引擎为 InnoDB[^4]。 2. **字段类型一致性** - 字段与参考字段的 **数据类型和长度必须完全一致**,否则会报错。 3. **策略选择** - **CASCADE**:父更新/删除时,子同步更新/删除[^4]。 - **SET NULL**:父删除时,子字段置空(需允许 NULL)。 - **RESTRICT**:默认行为,阻止父的删除/更新操作[^4]。 --- ### **相关问题** 1. 约束的 `CASCADE` 和 `SET NULL` 策略有什么区别? 2. 如何通过 SQL 语句直接添加约束? 3. 为什么在 Navicat 中设置时提示“存储引擎不支持”? 4. 约束的字段类型不匹配会导致什么问题? --- 以上操作步骤和注意事项均基于 Navicat 的交互逻辑及 MySQL 的约束机制[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值