主键:唯一标识,不能为空,加快查询速度,自动创建索引 外键:约束内表的数据的更新,从定义外键时可以发现 外键是和主键表联系,数据类型要统一,长度(存储大小)要统一。...这样在更新数据的时候会保持一致性 -创建表格语法: create table 表名( 字段名1 字段类型(长度) 是否为空, 字段名2 字段类型 是否为空...); -增加主键 alter table 表名 add constraint 主键名 primary key (字段名1); -增加外键: alter table 表名...add constraint 外键名 foreign key (字段名1) references 关联表 (字段名2); 在建立表格时就指定主键和外键 create table...varchar2(8) not null, constraint PK_T_STU primary key (STU_ID) ); 主键和外键一起建立
第一种:(不要外键约束) 手动删除外键约束; 删除表数据 第二种:(保留外键约束) SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE 表名; SET FOREIGN_KEY_CHECKS
在一个业务功能中要求先清空一张基础表(user表)再插入一批新数据。 在删除过程中报错为其它表有外键引用,无法删除。 于是,查询库中哪些表引用了 user 表中的主键为外键。...从 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 表中查。...select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME='被引用表的表名' 如图 红色框中是当前连接中的数据库...,黄框中的是引用了 user 表为外键的其它表,蓝色框中的是黄框中表的外键字段。...要想删除 user 表中的数据,就要先删除后面 2 个框中的外键引用。
SET FOREIGN_KEY_CHECKS=0; 删除,更新数据, 恢复外键 SET FOREIGN_KEY_CHECKS=1; 另:查看当前 FOREIGN_KEY_CHECKS的值 SELECT
1:创建一个父表,主键作为子表的外键: 1 create table province( 2 pId int primary key auto_increment, 3 pName varchar...(20) 4 ); 2:创建子表,外键是父表的主键: 1 create table user( 2 userId int primary key auto_increment, 3 userName varchar...(40), 4 pid int, 5 foreign key(pid) references province(pId) 6 ); 给一张表添加外键,即给子表的外键添加主键的规则: 在子表声明一个字段pid...int,用于作为子表的外键,foreign key(子表的外键字段) references 父表的表名(父表的主键的字段名); 3:当创建好数据表时添加外键约束: alter table user add...foreign key(pid) references province(pId); alter table 子表的数据表名 add foreign key(子表的外键名称) references 父表的数据表名称
写入内容为空时,默认从1,2,3...往下填充写入表格中。...primary key; alter table 表名 modify 列名 int, drop primary key; 添加外键:alter table 从表 add constraint...外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段); 删除外键:alter table 表名 drop foreign key 外键名称...-->要写入的内容 rollback; -->回滚到原来状态 commit; -->确认提交 外键 MySQL支持外键的存储引擎只有InnoDB ,...在创建外键的时候 , 要求父表必须有对应的索引 , 子表在创建外键的时候也会自动创建对应的索引
报的错误是时间的默认值有错误,查阅后发现原来是 MySQL 5.7 版本开始有了一个 STRICT MODE(严格模式),此模式中对默认值做了一些限制。...@@global.sql_mode=(select replace(@@global.sql_mode,'NO_ZERO_IN_DATE,NO_ZERO_DATE','')); 设置完成后重新连接 MySQL
以上仍然存在一个问题,当在员工表中输入不存的部门时,数据依然可以添加,不符合实际,因此,这里就可以通过使用外键约束来解决。 【概念】什么是外键约束?...外键,就是从表中与主表主键对应的那一列,如:员工表中的dep_id,其中,主表是一方,用来约束别人的表,从表可以是多方,被别人约束的表。 注意:外键可以为NULL,但是不能是不存在的外键值。 ?...1)创建表时添加外键 语法: create table 表名( ... ...外键列 constraint 外键名称 foreign key (外键列名称) references 主表名称(主表主键名称) ); -- 创建部门表...; 3)在创建表后添加外键: ALTER TABLE 表名称 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); -- 添加外键
总结 ---- 前言 我们在使用 MySQL 数据库时,添加数据如果设计不合理很容易出现外码约束的情况,为什么会产生这样的问题?那我们该如何处理这一问题呢?依据又是什么?...---- 说明:本次案例的案例情景是传统的数据库表:学生-课程数据库。 一、插入新数据时报错外键约束?...我们在 Course 表中插入课程号为 1 的数据时提示违反了外键约束,插入命令如下: insert into course(cno,cname,cpno,ccredit) values('1','数据库...','5',4); 二、对于出错 SQL 语句的分析 我们先根据 Course 表的定义,看哪一个是外键,查看 Course 表定义的 SQL 语句如下: create table course ( cno...---- 总结 本文我们掌握了 MySQL 数据库如何在设计不合理时遇到的外码约束的问题,并通过经典案例为大家分析了为何会出现这样的问题,同时顺着思路来设计业务的解决方案。
(根据外键查询效率很高) 删除外键约束后,必须 手动 删除对应的索引 添加外键约束 建表时 create table 主表名称( 字段1 数据类型 primary key, 字段2 数据类型 );...(2)删除表时,先删除从表emp,再删除主表dept 建表后 一般情况下,表与表的关联都是提前设计好了的,因此,会在创建表的时候就把外键约束定义好。...不一定要建外键约束 建外键约束,你的操作(创建表、删除表、添加、修改、删除)会受到限制,从语法层面受到限制。...字段名 数据类型 not null; #删除默认值约束,保留非空约束 面试 (1) 为什么建表时,加 not null default '' 或 default 0?...答:MySQL支持多种存储引擎,每一个表都可以指定一个不同的存储引擎,需要注意的是:外键约束是用来保证数据的参照完整性的,如果表之间需要关联外键,却指定了不同的存储引擎,那么这些表之间是不能创建外键约束的
; 外键约束 建表时添加外键约束 CREATE TABLE 表名( 列名 数据类型 约束, ......KEY 外键名; 建表后单独添加外键约束 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名); 外键的级联更新和级联删除...:ALTER TABLE 表名 ADD PRIMARY KEY(主键列名); 外键索引:ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES...方式一:给数据表中添加一个 version 列,每次更新后都将这个列的值加 1。 读取数据时,将版本号读取出来,在执行更新的时候,比较版本号。...读取数据时,将时间读取出来,在执行更新的时候,比较时间。 如果相同则执行更新,如果不相同,说明此条数据已经发生了变化。 行锁和表锁 InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。
(根据外键查询效率很高) (9)删除外键约束后,必须 手动 删除对应的索引 # 6.5 添加外键约束 (1)建表时 create table 主表名称( 字段1 数据类型 primary key,...(2)删除表时,先删除从表emp,再删除主表dept (2)建表后 一般情况下,表与表的关联都是提前设计好了的,因此,会在创建表的时候就把外键约束定义好。...员工表和部门表(一对多),它们之间是否一定要建外键约束?...答:不是的 问题 2:建和不建外键约束有什么区别? 答:建外键约束,你的操作(创建表、删除表、添加、修改、删除)会受到限制,从语法层面受到限制。...例如:在员工表中,可以添加一个员工的信息,它的部门指定为一个完全不存在的部门。 问题 3:那么建和不建外键约束和查询有没有关系? 答:没有 在 MySQL 里,外键约束是有成本的,需要消耗系统资源。
问题 在实验 8 中,我们为表生成了测试数据。 有小伙伴问:如果两个表有外键关系,我们生成的随机数据没法满足外键关系,怎么办? 实验 先来建一个测试库: ? 建两张有外键关系的表: ?...先为 office 表灌入一些基础数据: ? 然后为 user 表灌入支持外键的数据: ? 来看一下我们生成的效果: ?...可以看到生成工具为 office1 和 office2 两个外键列都生成了符合外键规范的数据: ? 而外键数据的采样数量正是 100。 ?...小技巧 如果大家希望为不同的外键列,生成不同采样数量的数据,可以创建多张表,每张表分别配置一个外键列,最后将多张表合并为一张表。.../fix_max-fk-samples/mysql_random_data_load.fix.tar.gz 下载作者临时修复的 linux 版本。
文章目录 前言 一、插入新数据时报错外键约束? 二、对于出错 SQL 语句的分析 三、对于外码约束的分析 四、如何处理外键约束?...总结 ---- 前言 我们在使用 MySQL 数据库时,添加数据如果设计不合理很容易出现外码约束的情况,为什么会产生这样的问题?那我们该如何处理这一问题呢?依据又是什么?...---- 本次案例的案例情景是传统的数据库表:学生-课程数据库。 一、插入新数据时报错外键约束? 我们在 Course 表中插入课程号为 1 的数据时提示违反了外键约束。...,看哪一个是外键。...---- 总结 本文我们掌握了 MySQL 数据库如何在设计不合理时遇到的外码约束的问题,并通过经典案例为大家分析了为何会出现这样的问题,同时顺着思路来设计业务的解决方案。
myisam的索引和数据分开存储,而有利于查询,但它不支持事务和外键等功能。而innodb虽说查询性能,稍微弱一点,但它支持事务和外键等,功能更强大一些。...例如:alter table product_sku add column brand_id int(10) not null default 0;8.外键在mysql中,是存在外键的。...外键存在的主要作用是:保证数据的一致性和完整性。...class表的id,这时通过foreign key增加了一个外键。...顺便说一句:只有存储引擎是innodb时,才能使用外键。如果只有两张表的关联还好,但如果有十几张表都建了外键关联,每删除一次主表,都需要同步删除十几张子表,很显然性能会非常差。
避免使用MySQL保留字 不要外键关联,一般用代码维护 一般都选择INNODB存储引擎 选择合适的字符集 如果数据库字段是枚举,就在comment注释清楚 时间类型的选择 不建议使用存储过程,触发器...否则设计表的时候,如果有查询条件的字段,一般就要加索引 索引使用的注意事项: 索引不要建的太多,一般单索引个数不要超过5个 去分度不高的字段,不能加索引,如:性别 索引建立完成后,还是要避免索引失效的情况...不要外键关联,一般用代码维护 这个在阿里的java规范也有提到: 【强制】不得使用外键与级联,一切外键概念必须在业务层解决 使用外键存在性能问题、并发死锁问题、使用起来不方使等等。...每次做 DELETE 或者 UPDATE 都必须考虑外键约束,会导致开发的时候很难受,测试数据造数据也不方便。 还有一个场景不能使用外键,就是分库分表。...又或者是把商品需要频繁增删改查的数据和基本不怎么用的数据给分离开来。 参考视频:21个MySQL表设计的经验准则
你知道怎么调优SQL吗? 怎么设计表或优化表? 为什么要合理的使用字段的长度? 为什么要用冗余设计? 临时表是什么? 为什么垂直分表可以提升性能?...索引无法存储null值,当使用is null或is not nulli时会全表扫描 like查询以"%"开头 对于复合索引,查询条件中没有给出索引中第一列的值时 mysql内部评估全表扫描比索引快时...不得使用外键与级联,一切外键概念必须在应用层解决。 说明:以学生和成绩的关系为例,学生表的 student_id 是主键,成绩表的 student_id 则为外键。...外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。 禁止使用存储过程。存储过程难以调试和扩展,更没有移植性。...ORM 映射 POJO 类的布尔属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中进行字段与属性的映射。
建表顺序 先建被关联表(多)即出版社表,再建关联表即书籍表(一) 关联表(书籍表)有一个外键press_id指向被关联表的主键(出版社id) 实践 # 先建被关联表 mysql> create table...需要第三张表来建立他们的外键关系,如下: ?...image.png 建表顺序 先建立author表和book表,在建立author2book表 author2book表中有两个外键 author_id 和 book_id author_id指向author...image.png 建表时遇到以下错误,原因是最后一行不需要逗号,去掉逗号即可: ?...image.png 不允许存在同名的外键(因为已经在author2book表中有一个外键的名字叫做fk_author): ?
建表时添加约束 CREATE TABLE 表名 ( 字段名 字段类型 PRIMARY KEY, 字段名 字段类型 ); 在已有表中添加约束 ALTER TABLE 表名 ADD PRIMARY...字段类型 default 值 外键约束 一个表中的字段引用另一个表的主键 主表: 主键所在的表,约束别人的表,将数据给别人用 副表/从表: 外键所在的表,被约束的表,使用别人的数据 创建外键 CREATE...ALTER TABLE 表名 DROP FOREIGN KEY(外键约束名); 外键的级联 在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作 ON UPDATE CASCADE –...两种建表原则: 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一UNIQUE 外键是主键:主表的主键和从表的主键,形成主外键关系 一对多 例如:班级和学生,部门和员工,客户和订单,...分类和商品 一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键 多对多 例如:老师和学生,学生和课程 多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键
对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。...主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。...定义外键时,需要遵守下列规则: ♞ 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。 ...key 外键字段 references 关联表(关联字段); # 删除外键 alter table tb_name drop foreign key 外键名称; 1.5.3 示例 # 部门表 mysql...1.6.2 语法 # 建表时添加 create table tb_name ( col_name col_type not null default default_value ); # 建表后添加
领取专属 10元无门槛券
手把手带您无忧上云