在没有默认值的列上使用change_column_default时,"from"值应该是nil或者NULL。
,可以在 :options 选项中使用SQL代码 create_table :products, options: "ENGINE=BLACKHOLE" do |t| t.string :name...除此之外,还有 change_column_null 和 change_column_default 方法,分别用于设置字段是否可为空、修改字段的默认值。...change_column_null :products, :name, false change_column_default :products, :approved, from: true, to...: false 作用是将products数据表的 :name 字段设置为 NOT_NULL,把 :approved 字段的默认值由 true 改为 false 。...字段修饰符 字段修饰符可以在创建或修改字段时使用,有 limit precision scale polymorphic null default index comment 外键 使用外键约束可以保证引用的完整性
在创建约束的列上添加唯一约束。 ...绑定默认值:使用sp_bindefault 默认值名,表名.列名。 注意:只有使用CREATE DEFAULT 关键字才需要绑定。 ...取消绑定默认值:使用sp_unbindefault 默认值名,表名.列名。 注意:只有使用CREATE DEFAULT 关键字才需要绑定。 ...) --代码示例:使用CREATE DEFAULT 关键字创建 CREATE DEFAULT DF_NAME AS 'tom' --代码示例:绑定默认值到CLASS表的NAME列上 sp_bindefault...可用空间页:数据库中数据页的使用情况,0表示没有使用,1表示使用。 */ --47.E-R(Entity-Relationship)模型的三要素是什么?
本文是在假定读者了解了直方图是什么,直方图如何进行添加维护的前提下,围绕直方图与索引的对比、何时应该添加直方图,及直方图如何帮助优化器选择更优的执行计划这几个方面来介绍直方图。...其实MySQL是这样设计的,有一个参数eq_range_index_dive_limit(默认值200), 对于索引列而言,当存在与此参数设置相等或更大的区间范围过滤条件时,优化器将从下潜转换为只使用索引统计信息来估算匹配行的数量...何时应该添加直方图 因为MySQL在sql优化阶段会对索引进行下潜操作来估算返回行数,导致直方图在MySQL中使用空间是有限的,那么究竟要在哪些列上创建直方图,才能有效发挥直方图的作用呢?...';两表在关联条件的字段上都有索引,又都有额外的过滤条件,优化器在选择走嵌套联接时,有两种可能,一种a1驱动a2,一种是a2驱动a1,哪种方式更好,取决于两表使用过滤条件过滤后哪个表返回的行数少,因为我们知道嵌套联接时...因为没有直方图时,优化器不知道谁的过滤性好,按等值过滤的默认规则filtered=10进行过滤,在选择执行计划时就有可能做出错误决策。 我们先看没有收集直方图时的执行计划。
,存储到 B+树 中就好,上面两图都是单列索引 但在实际应用中,更多的还是用到组合索引(在多列上建一个索引),既然有多列,那就存在列与列之间的顺序问题了 那组合索引的的结构具体是什么样的了...索引列上使用函数 说的更准确点,是在查询条件的左侧使用函数,这种情况就不能用索引了 ? 在右侧使用函数,还是能用到索引的 ? ...或 varchar 类型的列,传入 int 值是无法走索引的) 强烈建议:使用索引时,条件表达式的右侧常数的类型应该与列类型保持一致 IS NULL 与 IS NOT NULL 我做个简单的测试... 索引列上进行运算 索引列上使用函数 3、推荐做法 使用组合索引时,组合索引中的第一列必须写在查询条件的开头,而且索引中列的顺序不能颠倒 使用索引时,条件表达式的左侧应该是原始列...,右侧是常数且类型与左侧列一致,左右侧都不参与计算、使用函数(计算、函数运算、逻辑处理都交由专门的开发语言去实现) 所有列都指定 NOT NULL 和默认值,避免 NULL 的陷阱 参考 《
关键字介绍 SQL 是由关键字组成的语言,关键字是一些用于执行 SQL 操作的特殊词汇。在命名数据库、表、列和其他数据库对象时,一定不要使用这些关键字。因此,这些关键字是一定要保留的。...show character set; 为了查看所支持校对的完整列表,使用以下语句: show collation; 通常系统管理在安装时定义一个默认的字符集和校对。...此外,也可以在创建数据库时,指定默认的字符集和校对。...从网上找的各种帖子讨论来说,更多人推荐使用utf8mb4_unicode_ci,但是对于使用了默认值的系统,也并没有非常排斥,并不认为有什么大问题。...不过,在系统设计中,我们还是要尽量避免让系统严重依赖中文字段的排序结果,在 mysql 的查询中也应该尽量避免使用中文做查询条件。 此文已由作者授权腾讯云+社区发布,更多原文请点击。
SQL优化一般面试中我们能记住五条左右,被问到能够流畅自信说出几条是没有问题的,小伙伴们可根据自己理解在以下SQL优化技巧中找几条记住即可,理解为主,基础篇面试汇总可查看博主此文:Java基础面试题(2022...最新版汇总) 52条SQL优化面试 1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。...2、应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。...3、应尽量避免在where子句中使用!=或操作符,MySQL只有对以下操作符才使用索引:,>=,BETWEEN,IN,以及某些时候的LIKE。...4、应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用UNION合并查询:select id from t where num=10 union 发布者
这个值后面对应的utf8_unicode_ci是什么意思呢?面试的时候用这个题目考一考DBA,应该可以难倒一大部分人。 COLLATE是用来做什么的?...selection * from table1 where field1="a"同样可以把field1为"A"的值选出来。...从网上找的各种帖子讨论来说,更多人推荐使用utf8mb4_unicode_ci,但是对于使用了默认值的系统,也并没有非常排斥,并不认为有什么大问题。...即列上面没有指定COLLATE,则该列的COLLATE和表上设置的一样。 以上就是关于mysql的COLLATE相关知识。...不过,在系统设计中,我们还是要尽量避免让系统严重依赖中文字段的排序结果,在mysql的查询中也应该尽量避免使用中文做查询条件。
什么情况下使用索引?1、索引应该建在where 子句和 order by 经常查询的列上。2、对于两表连接的字段,应该建立索引。3、不应该在小表上建设索引(例如表中只有三四个字段)。...)),避免select *5、用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。...8、索引列上不要使用函数,oracle必须使用函数索引。9、以%开头的Like模糊查询(%xxx),索引失效。...检查语句是否走索引, 使用explain 关键执行一下 key是否有值, 有值就说明走了索引,null就表示索引失效使用索引注意事项:1、索引不会包含有null值的列 只要列中包含有null值都将不会被包含在索引中...所以我们在数据库设计时不要让字段的默认值为null。2、使用短索引 对串列进行索引,如果可能应该指定一个前缀长度。
方式一: 使用时间列上普通索引 方式二:使用虚拟列,在虚拟列上添加索引 方式三:使用函数索引 方式四:使用表达式默认值 总结 前言 独孤九剑,重剑无锋,大巧不工,通晓剑意,无所施而不可。...实际上在MySQL 8.0中创建函数索引时,MySQL会自动在表上创建一个隐藏的虚拟列,然后在虚拟列上创建索引。这里注意:虚拟列是不实际占用空间的,但是函数索引是需要实际占据空间的。...我们可以在时间列上加上普通索引,然后将系统上线使用以来的每年4月数据都遍历一下。...t_wang where month(fmodify_time) = 4; 方式四:使用表达式默认值 实际上我们还可以有另外一种方式来优化查询,同样是在MySQL 8.0还引入了另外一个特性,表达式默认值...MySQL 8.0.13开始,字段的DEFAULT 子句中指定的默认值可以是常量或表达式。将基于列的表达式计算值作为默认值,可以实现类似虚拟列的能力。
使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。 如果查询时没有使用索引,查询语句就会扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。...,就无法按索引执行 索引列上使用函数 索引列上使用函数是因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,所以无法使用索引。...如果过滤条件中没有使用联合索引中的第一个字段,则这个索引不会被使用到。 错误模糊查询 在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为’%‘,索引就不会起作用。...不走索引 SELECT * FROM `user` WHERE address IS NOT NULL; 走索引 如果没有必要的要求必须为NULL,那么最好给个默认值空字符串 为什么索引列无法存储...索引是有序的。NULL值进入索引时,无法确定其应该放在哪里。(将索引列值进行建树,其中必然涉及到诸多的比较操作,null 值是不确定值无法比较,无法确定null出现在索引树的叶子节点位置。)
这时缺少索引,对性能的影响便会越来越大了。 法则:不要在建立的索引的数据列上进行下列操作: 避免对索引字段进行计算操作 避免在索引字段上使用not,,!...= 避免在索引列上使用IS NULL和IS NOT NULL 避免在索引列上出现数据类型转换 避免在索引字段上使用函数 避免建立索引的列中使用空值 3.复杂操作 部分UPDATE、SELECT 语句...12.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num...上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 13.应尽量避免在 where 子句中使用!...20.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引, 否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num = 03. 应尽量避免在 where 子句中使用 !...索引是什么?有什么作用以及优缺点? 索引是什么? 数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。...在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。...long_query_time的默认值为10,意思是运行10S以上的语句。...log_output='FILE'表示将日志存入文件,默认值是'FILE'。
:对象字符集排序规则说明 servercharacter_set_servercollation_server 如果create database时未带上字符集和排序规则,则使⽤server中声明的作为默认值...,则使⽤数据库中声明的作为默认值;如果load data时未带上character set⼦句,则使⽤character_set_database作为默认值;如果在创建routine时未带上字符集和排序规则...,则使⽤数据库中声明的作为默认值;table建表时的CHARACTER SET ⼦句;建表时的COLLATE ⼦句;如果未在单个列上指定字符集和排序规则,则将表中声明的作为默认值;column建表时字段定义上的...; -- 设置列上忽略⼤⼩写insert into test_db.a values('a'),('A'); select * from test_db.a ; -- 存⼊的值含 "a" "A"select...from test_db.a ; -- 存⼊的值含"a" "A"select * from test_db.a where i='a'; -- 返回 "a"truncate table test_db.a
但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。...查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。...因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。...所以我们在数据库设计时不要让字段的默认值为NULL。 4,使用短索引 对字符串列进行索引,如果可能应该指定一个前缀长度。...7,不要在列上进行运算 select * from users where YEAR(adddate) 8,不使用NOT IN操作 NOT IN操作都不会使用索引将进行全表扫描。
= (3)避免在索引列上使用IS NULL和IS NOT NULL (4)避免在索引列上出现数据类型转换 (5)避免在索引字段上使用函数 例如:where trunc(create_date)=trunc...此处正确的写法应该是 where create_date>=trunc(:date1) and create_date (6)避免建立索引的列中使用空值。...F、不要写一些没有意义的查询,比如 SELECT * FROM EMPLOYEE WHERE 1=2 Where后面的原则 第一个原则:在where子句中应把最具限制性的条件放在最前面。...4) 在索引列上使用IS NULL 或IS NOT NULL操作。...索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可 5) 在索引字段上使用not,,!
= (3)避免在索引列上使用IS NULL和IS NOT NULL (4)避免在索引列上出现数据类型转换 (5)避免在索引字段上使用函数 例如: where trunc(create_date...此处正确的写法应该是 where create_date>=trunc(:date1) and create_date (6)避免建立索引的列中使用空值。 ...F、不要写一些没有意义的查询,比如: SELECT * FROM EMPLOYEE WHERE 1=2 Where后面的原则: 第一个原则:在where子句中应把最具限制性的条件放在最前面。...4) 在索引列上使用IS NULL 或IS NOT NULL操作。...索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可 5) 在索引字段上使用not,,!
(*) —————– 1 使用完后,我们发现SYS.COL_USAGE$还是没有列USER_ID的使用记录: SQL> select obj#,intcol#, equality_preds from...按道理讲应该是FREQUENCY啊! 当看到上述测试结果的时候,我意识到一定是什么地方出了问题。...这里的“workload of the columns”指的应该就是目标列是否在SYS.COL_USAGE$中有使用记录。...注意到Oracle这里还提到了另外一个条件——“based on data distribution”(这也是我之前没有注意到的条件),但这里的具体含义是什么?...如果目标列的distinct值的数量和目标表的数据量相同,即使该目标列在SYS.COL_USAGE$中有使用记录,Oracle在自动收集直方图统计信息的时候也不会对该列收集直方图统计信息。
D、自定义完整性:用户自己定义的业务规则,比如使用触发器实现自定义业务规则。 ? 2、数据完整性实现方式 ? MySQL不支持Check约束,虽然可以在列上添加check约束,但不起作用。...MyISAM类型的存储引擎不会在主键列上创建索引,表中记录的存储顺序与插入顺序相同。 ? InnoDB存储引擎会自动在主键列上创建索引,插入的记录会根据主键的值的顺序排放。...,但是没有自增长功能 4、复合主键 使用表的两列或多列创建主键。...alter table score drop index uc_sname; 三、域完整性 1、默认值 在表中插入一条新的记录时,如果没有为该字段赋值,那么数据库系统会自动为该字段赋一条默认值。...如果外键约束指定了参照动作,主表记录做修改,删除,从表引用的列会做相应修改,或不修改,拒绝修改或设置为默认值。 引用表的列名必须是主键,且在删除引用表时必须删除引用关系或者删除当前表。
dynamic),对它的使用需要多一次寻址,没有默认值。...enum类型在需要修改或增加枚举值时,需要在线DDL,成本较高;enum列值如果含有数字类型,可能会引起默认值混淆。tinyint使用1个字节,一般用于status、type、flag的列。...如果不能保证INSERT时该字段一定有值过来,解决方法: 通过设置默认值的形式,定义时使用DEFAULT ”或DEFAULT 0,来避免空字段的产生。...字符型的默认值为一个空字符值串”;数值型的默认值为数值0;逻辑型的默认值为数值0;其中,系统中所有逻辑型中数值0表示为假;数值1表示为真。...datetime、smalldatetime类型的字段没有默认值,必须为NULL。 3.6 同一意义的字段定义必须相同 比如不同表中都有user_id字段,那么它的类型、字段长度要设计成一样 4.
领取专属 10元无门槛券
手把手带您无忧上云