首页
学习
活动
专区
圈层
工具
发布

mysql中建立主外键

基础概念

MySQL中的主键(Primary Key)和外键(Foreign Key)是关系型数据库中用于维护数据完整性和一致性的约束。主键是表中的一个或多个字段,其值能唯一地标识表中的每一行记录。外键则是表中的一个字段或字段组合,它引用了另一个表的主键。

相关优势

  1. 数据完整性:通过主键和外键的约束,可以确保数据的引用完整性和实体完整性。
  2. 数据一致性:外键约束可以防止无效数据的插入,从而保持数据的一致性。
  3. 查询优化:主键和外键的使用可以提高查询效率,因为数据库系统可以利用这些索引快速定位和检索数据。

类型

  • 单字段主键:一个表只能有一个主键,可以是一个单独的字段。
  • 复合主键:由多个字段组成的主键,用于唯一标识表中的每一行。
  • 单字段外键:引用另一个表的单个主键字段。
  • 复合外键:引用另一个表的多个主键字段。

应用场景

  • 多表关联:当需要将多个表中的数据进行关联查询时,可以使用外键来建立表之间的关系。
  • 数据验证:通过外键约束,可以确保插入的数据在关联表中存在,从而避免无效数据的插入。

示例代码

假设我们有两个表:students 和 classes,其中 students 表中的 class_id 字段是外键,引用了 classes 表中的 id 主键。

代码语言:txt
复制
-- 创建 classes 表
CREATE TABLE classes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

-- 创建 students 表,并添加外键约束
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    class_id INT,
    FOREIGN KEY (class_id) REFERENCES classes(id)
);

遇到的问题及解决方法

问题:为什么无法插入外键约束引用的不存在的数据?

原因:外键约束确保了引用的完整性,即插入的外键值必须在被引用的主键表中存在。

解决方法:在插入数据之前,先确保被引用的主键表中存在相应的记录。或者,可以暂时禁用外键检查,插入数据后再重新启用。

代码语言:txt
复制
-- 禁用外键检查
SET FOREIGN_KEY_CHECKS = 0;

-- 插入数据
INSERT INTO students (name, class_id) VALUES ('Alice', 1);

-- 重新启用外键检查
SET FOREIGN_KEY_CHECKS = 1;

问题:如何删除外键约束?

解决方法:可以使用 ALTER TABLE 语句删除外键约束。

代码语言:txt
复制
-- 删除外键约束
ALTER TABLE students DROP FOREIGN KEY fk_class_id;

参考链接

通过以上内容,你应该对MySQL中的主键和外键有了全面的了解,并知道如何在实际应用中使用它们。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【数据库】MySQL进阶一、主外键讲解

MySQL进阶主外键讲解 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的...Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dept_id找到对应的部门,然后才能找到部门表里的各种字段信息,从而让二者相关联。...所以说,外键一定是在从表中创建,从而找到与主表之间的联系;从表负责维护二者之间的关系。 2.外键的使用需要满足下列的条件:(这里涉及到了InnoDB的概念) 1....MySQL常见引擎有两种:InnoDB和MyISAM,后者不支持外键。 2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。 3....建立外键关系的对应列必须建立了索引。 4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。

2.8K70

在PowerDesigner中设计物理模型1——表和主外键

在PD中建立物理模型由以下几种办法: 直接新建物理模型。 设计好概念模型,然后由概念模型生成物理模型。 设计好逻辑模型,然后由逻辑模型生成物理模型。...3.切换到Keys选项卡中,在其中添加一行命名为PK_ClassRoom,然后单击工具栏的“属性”按钮,打开键属性窗口,在该窗口中切换到Columns选项卡,单击添加列按钮,弹出列选择窗口,选中主键中应该包含的列...另外需要注意的是,在建立主键时,系统会在主键上建立索引,索引分为聚集索引和非聚集索引,在“键属性”窗口的General选项卡中可以设置该主键上建立的索引是聚集索引还是非聚集索引,如图所示: 外键 如果是由概念模型或者逻辑模型生成物理模型...,那么外键是通过Relationship生成的,也可以通过工具栏中的Reference来实现两表之间的外键关系。...”按钮,然后在设计面板中,课程表上按下鼠标左键,并拖拽到教师表中放开鼠标,这时如果课程表中没有RoomID列,系统会自动创建RoomID列并创建该列上的外键引用,如果已经存在RoomID列,则只添加外键引用

4K10
  • 在MySQL中建立自己的哈希索引(书摘备查)

    在MySQL中,只有Memory存储引擎支持显式的哈希索引,但是可以按照InnoDB使用的方式模拟自己的哈希索引。这会让你得到某些哈希索引的特性,例如很大的键也只有很小的索引。...然而,它将会使用键的哈希值进行查找,而不是键自身。你所要做的事情就是在where子句中手动地定义哈希函数。 一个不错的例子就是URL查找。URL通常会导至B-Tree索引变大,因为它们非常长。...//www.mysql.com'); 这种方式很不错,因为MysSQL查询优化器注意到url_crc列上有很小的、选择性很高的索引,并且它会使用里面的值进行索引查找。...你可以手工进行维护,在MySQL 5.0及以上版本中,可以使用触发器来进行维护。下面的例子显示了触发器如何在插入和更新值的时候维护url_crc列。...://www.mysql.com'); 哈希碰撞几率的增长比想象的要快。

    3.3K30

    SQL Server数据库中导入导出数据及结构时主外键关系的处理

    将“编写外键脚本”的值设置为false,意思是这一步骤生成的数据结构脚本中不包含表之间的外键关系。其他选项根据实际情况设置。 点击【确定】按钮,生成脚本,入下图。 ?...选中新建的数据库,打开步骤一中保存的”OriginalDataStructureWithoutFK.sql“脚本文件,运行该文件,运行成功后,目标数据库中成功创建了表、视图、存储过程、自定义函数,如下图...红色框内,将“编写外键脚本”设置为True,其他选项与步骤1中设置相反。点击"确定"按钮,生成脚本,另存为“OriginalDataStructureOnlyWithFK.sql”。...步骤6:导入外键结构关系脚本至目标数据库   选中目标数据库,打开步骤5中保存的“OriginalDataStructureOnlyWithFK.sql”脚本文件,运行之,运行成功后,查看表结构 ?...外键已经成功创建。

    2.7K40

    MySQL操作之数据查询语言:(DQL)(四-2)(多表查询)

    主表的主键和从表的外键形成主外关系 从表外键的值是对主表主键的引用。...从表外键类型,必须与主表主键类型一致。 建立外键的表必须是InnDB型,不能是临时表。 外键名不能用引号。FK_ID错误。应为FK_ID。、 添加数据时:从表的外键,只能添加主表主键中存在的数据。...ADD CONSTRAINT FK_ID FOREIGN KEY (gid) REFERENCES grade (id); 1.2 外键约束 建立外键约束是为了保证数据的完整性和一致性,但是如果主表中数据被删除或修改...ALTER TABLE 表名 DROP FOREIGN KEY 外键名; 具体: ALTER TABLE student DROP FOREIGN KEY FK_ID; 二、一对多操作 1.添加主外键约束...1、创建中间表,给中间表添加两个外键约束 2、创建表、添加数据 订单表和订单项表的主外键关系 alter table `orderitem` add constraint orderitem_orders_fk

    1.1K30

    外键要建立索引的原理和实验

    但发现有时开发人员提交SQL语句时未必会注意外键列需要定义索引,或者不清楚为什么外键列需要建立索引,网上一些所谓的“宝典”也会将外键列建索引作为其中的一条,包括TOM大师,曾说过: 导致死锁的头号原因是外键未加索引...2)如果删除了父表中的一行,整个子表也会被锁住(由于外键上没有索引)。 因此,无论从什么角度看,都有必要从原理上好好理解外键为何需要创建索引,或者说外键不创建索引会有什么问题?...(2) 删除主表记录的过程中,会根据外键字段检索子表记录,select /+ all_rows / count(1) from “TEST”.”T2” where “T1_ID” = :1,这就意味着,...(4) 只有外键创建索引,(1)中的操作才不会出现锁或hang状态,(2)中的操作才有可能使用索引。...通过以上实验,至少对外键不建立索引产生的影响,有了一些感性的认识,对外键为何要建立索引,应该有了更深入的理解。

    3.6K20

    MySQL索引的建立方式

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。...打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。...因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。 建立索引会占用磁盘空间的索引文件。 ---- 普通索引 创建索引 这是最基本的索引,它没有任何限制。...以下实例为在表中添加索引。 mysql> ALTER TABLE testalter_tbl ADD INDEX (c); 你还可以在 ALTER 命令中使用 DROP 子句来删除索引。...---- 显示索引信息 你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

    3.5K00

    Mysql合理建立索引,索引优化

    对数据较小的列使用索引,可以使索引文件更小,同时内存中也可以装载更多的索引键。 为较长的字符串使用前缀索引。比如数据的长度大部分是150个字节,我们只建立前100个字节的索引。...常见的可以用于建立索引的字段场景: ① 用户id 在订单表中的用户id字段上建立索引,根据用户id筛选订单,则会很快查询出用户的订单。...用户一般是在自己的后台查看订单,所以表中的其他用户数据与他无关,如果没有建立索引,每次查询都是全表扫描,则会很慢。...mysql中,多个索引同时使用?...优先对数据量比较小的字段建立索引,可以使索引文件更小,同时内存中也可以装载更多的索引键。 规范sql语句的生成,禁止发生列运算、类型转换的发生。

    5.8K20

    Mysql常用的建立索引规则

    建立索引的规则 建立索引常用的规则如下: 表的主键、外键必须有索引; 数据量超过300的表应该有索引; 经常与其他表进行连接的表,在连接字段上应该建立索引; 经常出现在Where子句中的字段,非凡是大表的字段...,应该建立索引; 索引应该建在选择性高的字段上(枚举型字段不建索引); 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: 正确选择复合索引中的主列字段...假如是,则可以建立复合索引;否则考虑单字段索引; 假如复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; 假如复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段...; 假如既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; 频繁进行数据操作的表,不要建立太多的索引; 删除无用的索引,避免对执行计划造成负面影响; ​ 以上是一些普遍的建立索引时的判定依据...一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。

    3.8K10

    常见的面试问题

    阅读量: 60 1、Mysql链表概述   因为表与表之间有关系,而且查询时需要两张表的某些数据。 链表的前提是:表与表之间必须设置主外键吗?   ...不是的,其实表与表之间不需要设置主外键关系,用数据库语句就可以实现链表查询,删除,修改,增加等操作。 为什么要设置主外键呢?   通常我们看到表与表之间有关系,常常设置主外键。为什么?...假设一个不了解你表结构的人,都能够任意的修改你的外键。那这个表就不严谨了。 我们到底设不设主外键呢?这就要分情况: 1、如果表结构简单,少量的表。逻辑不复杂。那么这个就不需要设置主外键了。...那么自己不可能记住所有主外键之间的关系,那么就需要设置主外键。 链表查询又分为:左联表,右链表。等。 链表不仅可以进行查询,还可以链表查询,链表增加,链表删除,链表修改。...在MySQL5.1和更新的版本中,InnoDB可以在服务器端过滤掉行后就释放锁,但在早期的MySQL版本中,InnoDB直到事务提交时才会解锁。对不需要的元组的加锁,会增加锁的开销,降低并发性。

    1.1K10

    MySQL外键约束

    关系键是关系数据库的重要组成部分。关系键是一个表中的一个或几个属性,用来标识该表的每一行或与另一个表产生联系。...其中就包括外键 1 主键(primary key或unique key) 又称主码,数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。...注意 : 外键不一定要与相应主键同名,只是在应用中为便于识别,当主键与相应外键属于不同关系时,往往取同名 作用 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。...使两张表形成关联,外键只能引用外表中的列的值或使用空值。 案例 如果不使用外键,表2的学号字段插了一个值(比如20140999999),但该值在表1中并没有。...然而在设置外键时,你插入表2学号字段的值必须要求在表1的学号字段能找到。 同时,如果你要删除表1的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。

    10.1K20

    mysql的外键

    在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。...外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持); 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引...,但如果在较早的版本则需要显示建立; 3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以; 外键的好处:可以使得两张表关联...| SET NULL | NO ACTION | SET DEFAULT}] 该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL...ON DELETE、ON UPDATE表示事件触发限制,可设参数: RESTRICT(限制外表中的外键改动) CASCADE(跟随外键改动) SET NULL(设空值) SET DEFAULT(设默认值

    8.9K70

    Mysql外键约束

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。...外键主要用来保证数据的完整性和一致性 两个表必须是InnoDB表,MyISAM表暂时不支持外键 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立...如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。...SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。...前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT; 后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE

    9.8K81
    领券