热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlchar约束_MySQL字符类型与约束条件

创建表完整的语法:createtable表名(字段名1类型[(宽度)约束条件],字段名2类型[(宽度)约束条件],字段名3类型[(宽度)约束条件]);注意事项

创建表完整的语法:

create table 表名(

字段名1 类型[(宽度) 约束条件],

字段名2 类型[(宽度) 约束条件],

字段名3 类型[(宽度) 约束条件]

);

注意事项:

1. 在同一张表中,字段名不能相同

2. 宽度和约束条件可选,字段名和类型是必须的

3. 最后一个字段后不能加逗号!

宽度:对存储数据的限制。

例如:新建一个表,create table t1(name char);   char类型默认的宽度为1,此时向表格插入数据,Insert into t1 values('jason');  此时会有两种可能!

严格模式  (STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION)

非严格模式

报错,因为插入的数据宽度超过了默认宽度1

插入成功,但插入数据的结果只有 j ,只显示一位。

在MySQL中有很多中的模式(mode),例如存储数据时,可选择严格模式和非严格模式,选择两种模式存储数据的效果区别如上图;怎样查询此时MySQL使用什么模式:show variables like '%mode%'; 百分号是任意匹配的意思。

此时在严格模式下,我们想要成功将数据插入,就只能选择更改数据的宽度;alter table t1 motify name char(15); 再次插入之前的数据;Insert into t1 values('jason');插入成功。

设置严格模式

set session:当前窗口下有效

set global:全局有效,终生受用!

set global sql_mode = "STRICT_TRANS_TABLES";

# 设置完成后需要退出客户端,重新登录客户端即可,不需要重启服务端

初识约束条件:

null 与 nut null

create table t1(id int,name char not null);  #  name 数据类型为 char 并且约束条件为 不能为空null;

insert into t1 values(1,'j');  # 正常存储

insert into t1 values(2,null);  # 报错

总结:数据类型与约束条件之间的关系,字段类型限制的是存储数据的类型,约束条件是基于字段类型之上的附加的额外限制。

1 数据类型

整型与浮点型

ae65154b80dfcc5691ce011a0a5eea41.png

如上图向 t1 插入数据的操作,char 与 varchar 数据类型 在默认模式下,select * from t1; 是看不出差别的,必须使用语句:select char_length(name) from t1; 的方式才能准求查出插入数据的长度;

另外也可以选择修改模式来查看:set global sql-mode='strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';

char vs varchar

char

varchar

优点:存取速度快,简单粗暴。

缺点:浪费空间

优点:节省空间

缺点:需要自动为数据制作报头,所以存取速度较慢。

枚举与集合

日期类型

枚举(enum):多选一

集合(set):多选多,虽然是多选多但是你可以只选一个

date 年月日

time 时分秒

datetime 年月日时分秒

year 年

create table t15(

id int,

birth date,

class_time time,

reg_time datetime,

yy year

);

insert into t15 values(1,"2000-01-21","11:11:11","2019-01-21 11:11:11","2019");

create table t16(

id int,

name char(6),

gender enum('male','female','others')

);

insert into t16 values(1,'egon','xxx');

create table t17(

id int,

name char(6),

gender enum('male','female','others'),

hobby set('read','DJ','DBJ','run')

);

insert into t17 values(1,'tank','male',"read,DBJ,DJ");

2 约束条件

PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录

FOREIGN KEY (FK)    标识该字段为该表的外键

NOT NULL    标识该字段不能为空

UNIQUE KEY (UK)    标识该字段的值是唯一的

AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)

DEFAULT    为该字段设置默认值

UNSIGNED 无符号

ZEROFILL 使用0填充

not null+default

create table user(

id int,

name char(16)

);

insert into user values(1,null) #可以修改

alter table user modify name char(16) notnull;

insert into user(name,id) values(null,2); #报错 插入数据可以在表名后面指定插入数据对应的字段

create table student(

id int,

name char(16) notnull,

gender enum('male','female','others') default 'male')

insert into student(id,name) values(1,'jason') #成功

unique

#单列唯一

create table user1(

id int unique,

name char(16)

);

insert into user1 values(1,'jason'),(1,'egon') #报错

insert into user1 values(1,'jason'),(2,'egon') #成功

#联合唯一

create table server(

id int,

ip char(16),

port int,

unique(ip,port)

)

insert into server values(1,'127.0.0.1',8080);

insert into server values(2,'127.0.0.1',8080); #报错

insert into server values(1,'127.0.0.1',8081);

primary key+auto_increment

#单从约束角度来说primary key就等价于not null unique

create table t11(id int primary key);

desc t11;

insert into t11 values(1),(1); #报错

insert into t11 values(1),(2);#除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率

"""强调:

1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键"""create table t12(

id int,

name char(16),

age intnotnull unique,

addr char(16) notnull unique

)engine=innodb;

desc t12;"""2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了

索引:类似于书的目录,没有主键就相当于一页一页翻着查

3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键"""

#联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键

create table t18(

ip char(16),

port int,

primary key(ip,port)

);

desc t18;#主键id作为数据的编号,每次最好能自动递增

create table t13(

id int primary key auto_increment,

name char(16)

);

insert into t13('jason'),('jason'),('jason'); #id字段自动从1开始递增#注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

auto_increment:自增

create table t27(

id int primary key auto_increment,

name char(16)

);#联合主键

create table t28(

ip char(16),

port int,

primary key(ip,port)

);

desc t28;



推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
author-avatar
思念如此难受_351
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有