首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从 MySQL 物理外键开始的思考

我们来看个例子,然后我们根据以下的点来分析: 一、外键的性能问题 我刚写了一些,然后发现有人写的更好而且简洁,就引用吧:@mysqlops 为何说外键有性能问题: 1.数据库需要维护外键的内部管理; 2....外键等于把数据的一致性事务实现,全部交给数据库服务器完成; 3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源; 4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况...比较公认的是,他的外键设计得的确不是很好,限制多功能不强大等。(同样的,讨论是不是该用存储过程也存在这种思考) 这里贴上一些从博客园看到的,比较严重的问题。...) 默认的行为应被延迟检查(即约束仅在整个SQL语句被处理之后才被检查) 类似一般的MySQL,在一个插入,删除或更新许多行的SQL语句内,InnoDB逐行检查UNIQUE和FOREIGN KEY约束。...四、外键对拓展性的限制和影响 计划赶不上变化,外键的主从关系是定的,然后你会因为这个做很多事情,但是万一哪天主键所在表就见鬼去了呢?万一哪天你发现外键表不是非得跟人家的主键挂上关系呢?

3.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从 Django 模型中根据类查找外键

    例如,在 Book 模型中,外键可能叫做 author_id, 而在 Article 模型中,外键可能叫做 author.我们希望有一个方法可以根据外键的类来检索外键对象,无论外键的名称是什么。...例如,我们希望有一个方法可以获取 Book 模型中指向 Author 模型的外键对象,无论这个外键的名称是什么。...该方法返回外键字段的名称。我们还可以在模型类中定义一个 get_foreign_key_to() 方法,该方法返回指向给定类的外键字段。...该方法返回了指向 Author 模型的外键字段,并将其存储在 author_foreign_key 变量中。问题背景Foo 有很多可以从 Django 模型引用的外键,但我希望使用通用方法来获取对象。...然后,它在 Book 和 Article 模型中使用 get_foo() 函数来获取指向 Foo 对象的外键。最后,它打印指向 Foo 对象的外键的名称。

    8810

    【YashanDB知识库】自关联外键插入数据时报错YAS-02033

    问题现象使用如下的sql语句创建自关联外键表:然后使用如下语句,尝试插入两行数据,这两行数据汇总起来,是符合外键关联关系的:insert into self_f_key select 1,2 from...dual union all select 2,1 from dual;但是yashandb插入失败:问题的风险及影响影响正常的业务处理流程,同样的建表语句,同样的insert,可以在oracle中正常执行...问题影响的版本所有的yashandb版本问题发生原因目前yashandb在处理此种情况下的完整性约束判断时,没有在事务级进行统一判断,而是使用了类似于一行一行的判断逻辑,所以在事务级看来没有违反完整性约束的数据无法插入解决方法及规避方式规避方法...:禁用外键约束问题分析和处理过程根据现网的问题场景,构造可以同时在yashandb/oracle执行的sql语句,比较并确认双方的表现差异yashandb对于此种情况下完整性约束的判断核心在idxCheckKeyExist

    3400

    【YashanDB 知识库】自关联外键插入数据时报错:YAS-02033 foreign key constraint violated parent key

    问题现象使用如下的 sql 语句创建自关联外键表:drop table self_f_key;create table self_f_key(t1 number primary key not null...);alter table self_f_key add constraint c_0001 foreign key(t2) references self_f_key(t1);然后使用如下语句,尝试插入两行数据...,这两行数据汇总起来,是符合外键关联关系的:insert into self_f_key select 1,2 from dual union all select 2,1 from dual;但是 yashandb...插入失败:问题的风险及影响影响正常的业务处理流程,同样的建表语句,同样的 insert,可以在 oracle 中正常执行:问题影响的版本所有的 yashandb 版本问题发生原因目前 yashandb...在处理此种情况下的完整性约束判断时,没有在事务级进行统一判断,而是使用了类似于一行一行的判断逻辑,所以在事务级看来没有违反完整性约束的数据无法插入解决方法及规避方式规避方法:禁用外键约束问题分析和处理过程根据现网的问题场景

    5100

    MySql---外键复习

    一个表可以有一个或多个外键。 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。...INSERT INTO depart (d_name) VALUES ("研发部"),("人事部"); 从表插入数据 #添加一个符合外键约束的数据 INSERT INTO emp (e_name,d_id...最后一个修改解释: 例如: 部门表id为3的部门下面有员工,向把部门id的值从3改到4 1.先修改副表,先把员工表外键id=3的员工先挂到其他部门下面,解除部门表id=3和员工表外键id=3的关系 2....再修改主表,解除挂钩之后,就可以修改部门表id的值从3到4,改完之后,再把之前临时挂到其他部门的员工给再挂回到改好的部门 ---- 注意事项 #添加一个符合外键约束的数据 INSERT INTO emp...",10); #添加一个符合外键约束的数据 INSERT INTO emp (e_name,d_id) VALUES("大朋友",2); 注意观察主键id自增 如果插入的数据因为不符合外键约束插入失败了

    5.2K30

    再谈表的约束

    ,那么默认从1开始,如果插入了一个自增值,那么后面如果没有插入自增值,就从上一个继续开始: 也可以自己设定一个起始值: mysql> create table tt22( id int unsigned...AUTO_INCREMENT 的值(批量插入获取的是第一个值): mysql> select last_insert_id(); 唯一键 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键...id是一样的,就会插入失败: 唯一键可以为空: 外键 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。...在从表中插入班级id为1和2都是可以的,但是插入的班级id为3,由于外键约束,导致插入失败。...删除主表中班级id为1 的班级: id为1的班级里面还有学生,由于外键约束导致删除失败。

    5510

    轻松学习SQL外键约束的核心原理和实用技巧

    它是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须且有主键约束或者唯一约束。被依赖的表通常称之为父表或者主表,设置外键约束的表称为子表或从表。...相关概念主键:可以唯一标识一条记录的列外键:从表中与主表的主键对应的字段主表:外键所指向的表,约束其他表的表从表:外键所在的表,被约束的表价值:建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性建立外键约束创建表时添加外键约束...(id));#插入一条非法数据INSERTINTOemp_partVALUES(1,'cindy',20,'female','4')删除外键约束语法:ALTER TABLE [表名] DROP FOREIGN...id=2的部门DELETEFROMdeptWHEREid=2#查看从表中的数据是否同时被删除SELECT*FROMemp_part总结SQL 中的外键约束是一种参照完整性约束,它用于确保两个表之间的数据一致性...当在子表中插入或更新数据时,外键约束确保所提供的外键值必须在父表的相应主键或唯一键值范围内。如果父表中不存在相应的值,则操作将失败,从而确保了数据的完整性和一致性。

    32510

    MySQL外键约束使用

    如何创建外键约束在MySQL中,创建外键约束需要以下步骤:第一步:创建主表和从表外键约束通常涉及到两个表,一个主表和一个从表。主表包含一个列或一组列,其值将在从表中进行比较。...从表包含外键列,其值必须与主表中的值匹配。在本例中,我们将创建两个表:一个名为"orders"的主表和一个名为"customers"的从表。"...以下是如何使用外键约束的一些示例:插入数据:当向"orders"表中插入数据时,如果在"customer_id"列中插入一个不存在于"customers"表中的值,则会引发外键约束错误。..."表中存在与该值匹配的"customer_id"值,则会引发外键约束错误。...row: a foreign key constraint fails删除数据:当从"customers"表中删除一行时,如果在"orders"表中存在与该行相关联的"customer_id"值,则会引发外键约束错误

    4.1K30

    MySQL【知识改变命运】08

    POREIGN KEY 外键约束 外键约束关联两张表 CHECK 约束 用于限制或数据库表中的值,确保数据可靠性,准确性 2:NOT NULL非空约束 创建一个表: 创建一个学生表中,name一般不能为...3:UNIQUE 唯⼀约束 当我们设置让一个列有唯一值时候,就可以给这列设置UNIQUE ,比如我们让id列为唯一值; 创建一个表: 我们给id列限制了UNIQUE,id就不能插入重复值,所有当第二次插入数据时候...5:FOREIGN KEY 外键约束 外键⽤于定义主表和从表之间的关系 外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束 当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为...5.1:创建班级表(主表),并初始化数据 5.2:重构学⽣表(从表),加⼊外键约束 # 语法: foreign key (id) references class(id) drop table if exists...; 查看表结构,Key列的值为MUL表⽰外键约束的列 正常插⼊数据 插⼊⼀个班级号为100的学⽣,由于主表中没有这个班级,插⼊失败 插⼊班级Id为NULL的记录,可以成功,表⽰当前学

    6310

    【MySQL】表的约束

    默认是从 1 开始计数的,如果我们中途插入一个其它 id 的数据,然后继续默认插入呢?...(20) -> ); 查看表结构: 插入相同的 id 会报错,因为 id 字段具有唯一键: 但是可以插入空: 八、外键 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或...外键就很好地解决了这个问题,外键就是为这两张表建立外键约束。 那么我们要为哪个表添加外键约束呢?我们知道,一个学生一定是隶属于某一个班级的,所以 stu 应该是从表,我们要为从表添加外键约束!...(class_id) -> ); 接下正常插入数据: 然后插入一个不存在的班级的同学,会出现错误,因为外键约束: 我们再尝试删除一个还有同学的班级:delete from class where...class_id=10; 我们还可以插入一个班级 id 为空的同学,代表目前还没有分配班级: 如上就是外键约束为我们解决的问题。

    15510

    MySQL表的约束

    : 当然,就如同缺省值default一样,这个由于主键的唯一性多了一个自增的条,因此id也可以插入指定的数字: 如果继续插入,不理会id,那么它就会从1000开始自增,下一个就是1001: 为什么能够接着自定义的数据继续自增计数呢...,因此两个表之间一定存在所属关系,学生属于班级,设计表时通过外键约束学生就属于从表,班级就属于主表。...外键是用于定义主表和从表之间的关系 外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。...所以,我们需要重新建立一个从表student,目的是引入外键的逻辑关系。 目前的学生表是空的,先插入数据: 若删除id=1的班级,也不会成功,因为student中还存在class_id=1的学生。...只有在student中不存在id=1的学生,才能删除。 这就叫做外键约束。外键的本质就是产生关联,增加约束,保证表和表之间的完整性。

    22650

    mysql学习笔记(四)约束与索引

    例如学生表和课程表 从表:外键所在,依赖主表的表。...例如选课表,表中有两个外键,分别参考学生表和课程表 约束的五个等级: cascade方式:级联,主动权在主表上,如果主表被依赖字段修改了,从表的外键字段也会跟着修改。...set null方式:主动权在主表上,如果主表被依赖字段修改了,从表的外键字段会将值设置为Null,这里要求,外键字段不能有非空约束。...set default方式:主动权在主表上,如果主表被依赖字段修改了,从表的外键字段会将值设置为default,这里要求,外键字段必须有默认约束。...ID列是由系统自动赋值的,在赋值时,系统根据该表的ID值,自动插入递增的,唯一的数值,同时ID值根据Increment自动递增。

    2.1K00

    数据库之数据表控制语句

    | name | +----+------+ | 1 | zyz | | 2 | lisi | +----+------+ 从上面的测试可以看出,只插入了两个name的值,并没有插入id的值,但是查看表数据时...6、删除外键 将上面添加的外键删除,tab3_tab1_name是外键的名称。...,这里就要谈谈什么是外键了 查询相关资料都是讲一些术语。...学生表的 sid 就是外键。 从表也叫外键表,主表也叫主键表、外表,列也叫字段。 所以在设计的时候。就给表1加入一个外键,这个外键就是表2中的学号字段。那么这样表1就是主表,表2就是子表。...表2是子表,但不是叫做给表1加入一个外键,而是给表2加入一个外键,表2中的学号 字段就叫外键,它是表1学号字段的主键。

    1.1K40

    MySQL基础之常见约束和标识列

    : 1、要求在从表设置外键关系 2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求 3、主表的关联列必须是一个key(一般是主键或唯一) 4、插入数据时,先插入主表,再插入从表...)#外键 ); CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) ); #查看stuinfo中的所有索引,包括主键、...)#外键 ); SHOW INDEX FROM stuinfo; 通用的写法:★ CREATE TABLE IF NOT EXISTS stuinfo( id INT PRIMARY KEY,...ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major; SHOW INDEX FROM stuinfo; 标识列 又称为自增长列 含义:可以不用手动的插入值...3、标识列的类型只能是数值型 4、标识列可以通过 SET auto_increment_increment=3;设置步长 可以通过 手动插入值,设置起始值 创建表时设置标识列 DROP TABLE

    64810

    6-数据类型与常见约束

    Mysql不支持】检查约束,比如年龄,性别可以用来限制 FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值 (在从表添加外键约束,用于引用主表中的某列的值...major(id) # 外键 ); # 主键和唯一键的区别 /* 1....主键需要用drop删除,modify不可以删除主键 */ # 外键 /* 要求在从表设置外键关系 从表的外键列的类型和主表的关联列的类型要求一致或兼容 主表的关联列必须是一个KEY(主键/唯一键)...插入数据时,先插入主表,再插入从表 删除数据时,先删除从表,再删除主表 */ # 修改表时添加约束 /* 列级约束: ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型...ALTER TABLE stu_info ADD PRIMARY KEY(id); ALTER TABLE stu_info ADD UNIQUE(id); # 外键只有用表记约束才有效果 ALTER

    69310

    一篇文章带你彻底了解MySQL各种约束

    参照完整性: 也就是说是MySQL的外键 1. default 概念 - 指定某列的默认值,插入数据时候,此列没有值,则用default指定的值来填充 添加 - 在创建表的时候添加: create...,每个外键必须参照另一个主键。...- 被外键约束的列,取值必须参照其主表列中的值 - 注意:通常先创建主表,再创建从表 添加外键约束 - create table emp(      ...- 使用 show create table 表名 查看具体的外键名称 设置外键中的级联关系 - on delete cascade: 删除主表中的数据时,从表中的数据随之删除 - on update...); 注意: - 插入数据时,先插入主表的数据,再插入从表的数据 - 删除数据时,先删除从表的数据,再删除主表的数据 数据库的设计 主键约束 自增长约束 外键约束(慎用) 唯一约束 非空约束

    998127

    【MySql】表的约束

    对于自增长:默认是从1开始插入的,如果默认插入了一个值作为起始值,则从这个起始值加1开始 所以我们在创建表的时候可以给自增长设置一个起始值: mysql> create table t22( -...外键foreign key 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。...rows affected (0.03 sec) 学生表为从表,班级表是主表,class_id就是外键,需要考虑关联和约束关系 插入学生信息的班级必须存在。...所以我们需要新建一个从表student并设置外键: mysql> create table if not exists student( -> id int unsigned primary key...解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

    21530

    【Mysql】:linux环境下表的三部曲(数据操作 + 类型解析 + 约束规则)

    外键 用于 确保表间数据的一致性,例如:防止插入一个不存在班级的学生或删除一个还有学生的班级。 定义:外键约束用于建立主表和从表之间的关联关系,主要定义在从表上,主表必须包含主键或唯一键。...外键 用于定义 主表 和 从表 之间的关系: 外键约束主要定义在从表上 主表则必须是有主键约束或 unique 约束 当定义外键后,要求外键列数据必须在主表的主键列存在或为 NULL 在从表中,设置外键约束...,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整 3.8 外键(foreign Key) 外键: 从表和主表的关联关系 产生外键约束 为什么需要外键约束?...外键 用于 确保表间数据的一致性,例如:防止插入一个不存在班级的学生或删除一个还有学生的班级。 定义:外键约束用于建立主表和从表之间的关联关系,主要定义在从表上,主表必须包含主键或唯一键。...外键 用于定义 主表 和 从表 之间的关系: 外键约束主要定义在从表上 主表则必须是有主键约束或 unique 约束 当定义外键后,要求外键列数据必须在主表的主键列存在或为 NULL 在从表中,设置外键约束

    3600
    领券