一、存储引擎

二、表介绍

表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段

id

name

age

sex

1

li

12

male

2

liu

13

female

3

hai

24

female

4

song

16

male

id,name,age,sex称为字段,其余的,一行内容称为一条记录

三、创建表

#语法:

create table 表名(

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

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

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

);

#注意:

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

2. 宽度和约束条件可选

3. 字段名和类型是必须的

mysql>create database db1 charset utf8;

mysql>use db1;

mysql>create table t1(

-> id int,

-> name varchar(50),

-> sex enum('male','female'),

-> age int(3)

-> );

mysql>show tables; #查看db1库下所有表名

mysql>desc t1;

+-------+-----------------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-----------------------+------+-----+---------+-------+

| id | int(11) | YES | | NULL | |

| name | varchar(50) | YES | | NULL | |

| sex | enum('male','female') | YES | | NULL | |

| age | int(3) | YES | | NULL | |

+-------+-----------------------+------+-----+---------+-------+

mysql>select id,name,sex,age from t1;

Empty set (0.00 sec)

mysql>select * from t1;

Empty set (0.00 sec)

mysql>select id,name from t1;

Empty set (0.00 sec)

mysql>insert into t1 values

-> (1,'wang',18,'male'),

-> (2,'li',81,'female')

-> ;

mysql> select * from t1;

+------+------+------+--------+

| id | name | age | sex |

+------+------+------+--------+

| 1 | wang | 18 | male |

| 2 | li | 81 | female |

+------+------+------+--------+

mysql>insert into t1(id) values

-> (3),

-> (4);

mysql>select * from t1;

+------+------+------+--------+

| id | name | age | sex |

+------+------+------+--------+

| 1 | wang | 18 | male |

| 2 | li | 81 | female |

| 3 | NULL | NULL | NULL |

| 4 | NULL | NULL | NULL |

+------+------+------+--------+

注意注意注意:表中的最后一个字段不要加逗号

四、查看表结构

mysql>describe t1; #查看表结构,可简写为desc 表名

+-------+-----------------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-----------------------+------+-----+---------+-------+

| id | int(11) | YES | | NULL | |

| name | varchar(50) | YES | | NULL | |

| sex | enum('male','female') | YES | | NULL | |

| age | int(3) | YES | | NULL | |

+-------+-----------------------+------+-----+---------+-------+

mysql>show create table t1\G; #查看表详细结构,可加\G

五、数据类型

一、介绍

存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的

mysql常用数据类型概览

#1. 数字:

整型:tinyinit int bigint

小数:

float :在位数比较短的情况下不精准

double :在位数比较长的情况下不精准

0.000001230123123123

存成:0.000001230000

decimal:(如果用小数,则用推荐使用decimal)

精准

内部原理是以字符串形式去存

#2. 字符串:

char(10):简单粗暴,浪费空间,存取速度快

root存成root000000

varchar:精准,节省空间,存取速度慢

sql优化:创建表时,定长的类型往前放,变长的往后放

比如性别 比如地址或描述信息

>255个字符,超了就把文件路径存放到数据库中。

比如图片,视频等找一个文件服务器,数据库中只存路径或url。

#3. 时间类型:

最常用:datetime

#4. 枚举类型与集合类型

enum:多选一(从指定的属性中选择一个)比如:性别

set:多选多(从多个属性中选择多个,选择的多个属性用一对引号,中间用空格间隔开) 比如:爱好;

注意:选择不再范围内报错

二、数值类型

整数类型

tinyint smallint mediumint int bigint

作用:存储年龄,等级,id,各种号码等

tinyint[(m)] [unsigned] [zerofill]

小整数,数据类型用于保存一些范围的整数数值范围:

有符号:

-128 ~ 127

无符号:

0 ~ 255

int[(m)][unsigned][zerofill]

整数,数据类型用于保存一些范围的整数数值范围:

有符号:

-2147483648 ~ 2147483647

无符号:

0 ~ 4294967295

bigint[(m)][unsigned][zerofill]

大整数,数据类型用于保存一些范围的整数数值范围:

有符号:

-9223372036854775808 ~ 9223372036854775807

无符号:

0 ~ 18446744073709551615

注意:整型数字int(11),不指定宽度,默认也是11位,数据类型后的宽度并不是存储限制,而是显示限制;

如果不指定unsigned(无符号),默认都有signed(有符号),即有‘-’;指定unsigned时,紧跟着int后,不能写在别的约束条件后面;

zerofill表示位数不足用‘0’补充;

#tinyint默认为有符号

mysql> create table t1(x tinyint); #默认为有符号,即数字前有正负号

mysql> desc t1;

mysql> insert into t1 values

-> (-129),

-> (-128),

-> (127),

-> (128);

mysql> select * from t1;

+------+

| x |

+------+

| -128 | #-129存成了-128

| -128 | #有符号,最小值为-128

| 127 | #有符号,最大值127

| 127 | #128存成了127

+------+

#设置无符号tinyint

mysql> create table t2(x tinyint unsigned);

mysql> insert into t2 values

-> (-1),

-> (0),

-> (255),

-> (256);

mysql> select * from t2;

+------+

| x |

+------+

| 0 | -1存成了0

| 0 | #无符号,最小值为0

| 255 | #无符号,最大值为255

| 255 | #256存成了255

+------+

============有符号和无符号int=============

#int默认为有符号

mysql> create table t3(x int); #默认为有符号整数

mysql> insert into t3 values

-> (-2147483649),

-> (-2147483648),

-> (2147483647),

-> (2147483648);

mysql> select * from t3;

+-------------+

| x |

+-------------+

| -2147483648 | #-2147483649存成了-2147483648

| -2147483648 | #有符号,最小值为-2147483648

| 2147483647 | #有符号,最大值为2147483647

| 2147483647 | #2147483648存成了2147483647

+-------------+

注意:通常int(11)表示有符号

#设置无符号int

mysql> create table t4(x int unsigned);

mysql> insert into t4 values

-> (-1),

-> (0),

-> (4294967295),

-> (4294967296);

mysql> select * from t4;

+------------+

| x |

+------------+

| 0 | #-1存成了0

| 0 | #无符号,最小值为0

| 4294967295 | #无符号,最大值为4294967295

| 4294967295 | #4294967296存成了4294967295

+------------+

==============有符号和无符号bigint=============

mysql> create table t6(x bigint);

mysql> insert into t5 values

-> (-9223372036854775809),

-> (-9223372036854775808),

-> (9223372036854775807),

-> (9223372036854775808);

mysql> select * from t5;

+----------------------+

| x |

+----------------------+

| -9223372036854775808 |

| -9223372036854775808 |

| 9223372036854775807 |

| 9223372036854775807 |

+----------------------+

mysql> create table t6(x bigint unsigned);

mysql> insert into t6 values

-> (-1),

-> (0),

-> (18446744073709551615),

-> (18446744073709551616);

mysql> select * from t6;

+----------------------+

| x |

+----------------------+

| 0 |

| 0 |

| 18446744073709551615 |

| 18446744073709551615 |

+----------------------+

======用zerofill测试整数类型的显示宽度=============

mysql> create table t7(x int(3) zerofill);

mysql> insert into t7 values

-> (1),

-> (11),

-> (111),

-> (1111);

mysql> select * from t7;

+------+

| x |

+------+

| 001 |

| 011 |

| 111 |

| 1111 | #超过宽度限制仍然可以存

+------+

nt的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok

浮点型

#FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

定义:

单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30

有符号:

-3.402823466E+38 to -1.175494351E-38,

1.175494351E-38 to 3.402823466E+38

无符号:

1.175494351E-38 to 3.402823466E+38

精确度:

**** 随着小数的增多,精度变得不准确 ****

======================================

#DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

定义:

双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30

有符号:

-1.7976931348623157E+308 to -2.2250738585072014E-308

2.2250738585072014E-308 to 1.7976931348623157E+308

无符号:

2.2250738585072014E-308 to 1.7976931348623157E+308

精确度:

****随着小数的增多,精度比float要高,但也会变得不准确 ****

======================================

decimal[(m[,d])] [unsigned] [zerofill]

定义:

准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。

精确度:

**** 随着小数的增多,精度始终准确 ****

对于精确数值计算时需要用此类型

decaimal能够存储精确值的原因在于其内部按照字符串存储。

mysql> create table t1(x float(256,31));

ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.

mysql> create table t1(x float(256,30));

ERROR 1439 (42000): Display width out of range for column 'x' (max = 255)

mysql> create table t1(x float(255,30)); #建表成功

Query OK, 0 rows affected (0.02 sec)

mysql> create table t2(x double(255,30)); #建表成功

Query OK, 0 rows affected (0.02 sec)

mysql> create table t3(x decimal(66,31));

ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.

mysql> create table t3(x decimal(66,30));

ERROR 1426 (42000): Too-big precision 66 specified for 'x'. Maximum is 65.

mysql> create table t3(x decimal(65,30)); #建表成功

Query OK, 0 rows affected (0.02 sec)

mysql> show tables;

+---------------+

| Tables_in_db1 |

+---------------+

| t1 |

| t2 |

| t3 |

+---------------+

3 rows in set (0.00 sec)

mysql> insert into t1 values(1.1111111111111111111111111111111); #小数点后31个1

Query OK, 1 row affected (0.01 sec)

mysql> insert into t2 values(1.1111111111111111111111111111111);

Query OK, 1 row affected (0.00 sec)

mysql> insert into t3 values(1.1111111111111111111111111111111);

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from t1; #随着小数的增多,精度开始不准确

+----------------------------------+

| x |

+----------------------------------+

| 1.111111164093017600000000000000 |

+----------------------------------+

1 row in set (0.00 sec)

mysql> select * from t2; #精度比float要准确点,但随着小数的增多,同样变得不准确

+----------------------------------+

| x |

+----------------------------------+

| 1.111111111111111200000000000000 |

+----------------------------------+

1 row in set (0.00 sec)

mysql> select * from t3; #精度始终准确,d为30,于是只留了30位小数

+----------------------------------+

| x |

+----------------------------------+

| 1.111111111111111111111111111111 |

+----------------------------------+

1 row in set (0.00 sec)

三、字符串类型

#char类型:定长,简单粗暴,浪费空间,存取速度快

字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)

存储:

存储char类型的值时,会往右填充空格来满足长度

例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储

检索:

在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)

#varchar类型:变长,精准,节省空间,存取速度慢

字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)

存储:

varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来

强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)

如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)

如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)

检索:

尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容

Value

CHAR(4)

Storage Required

VARCHAR(4)

Storage Required

''

' '

4 bytes

''

1bytes

'ab'

'ab '

4 bytes

'ab'

3 bytes

'abcd'

'abcd'

4 bytes

'abcd'

5 bytes

'abcdefgh'

'abcd'

4 bytes

'abcd'

5 bytes

测试前了解两个函数

length:查看字节数

char_length:查看字符数

char填充空格来满足固定长度,但是在查询时却会很不要脸地删除尾部的空格(装作自己好像没有浪费过空间一样),然后修改sql_mode让其现出原形

mysql> create table t1(x char(5),y varchar(5));

Query OK, 0 rows affected (0.26 sec)

#char存5个字符,而varchar存4个字符

mysql> insert into t1 values('你瞅啥 ','你瞅啥 ');

Query OK, 1 row affected (0.05 sec)

mysql> SET sql_mode='';

Query OK, 0 rows affected, 1 warning (0.00 sec)

#在检索时char很不要脸地将自己浪费的2个字符给删掉了,装的好像自己没浪费过空间一样,而varchar很老实,存了多少,就显示多少

mysql> select x,char_length(x),y,char_length(y) from t1;

+-----------+----------------+------------+----------------+

| x | char_length(x) | y | char_length(y) |

+-----------+----------------+------------+----------------+

| 你瞅啥 | 3 | 你瞅啥 | 4 |

+-----------+----------------+------------+----------------+

1 row in set (0.00 sec)

#略施小计,让char现出原形

mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

Query OK, 0 rows affected (0.00 sec)

#这下子char原形毕露了......

mysql> select x,char_length(x),y,char_length(y) from t1;

+-------------+----------------+------------+----------------+

| x | char_length(x) | y | char_length(y) |

+-------------+----------------+------------+----------------+

| 你瞅啥 | 5 | 你瞅啥 | 4 |

+-------------+----------------+------------+----------------+

1 row in set (0.00 sec)

#char类型:3个中文字符+2个空格=11Bytes

#varchar类型:3个中文字符+1个空格=10Bytes

mysql> select x,length(x),y,length(y) from t1;

+-------------+-----------+------------+-----------+

| x | length(x) | y | length(y) |

+-------------+-----------+------------+-----------+

| 你瞅啥 | 11 | 你瞅啥 | 10 |

+-------------+-----------+------------+-----------+

1 row in set (0.00 sec)

虽然 CHAR 和 VARCHAR 的存储方式不太相同,但是对于两个字符串的比较,都只比 较其值,忽略 CHAR 值存在的右填充,即使将 SQL MODE 设置为 PAD_CHAR_TO_FULL LENGTH 也一样,,但这不适用于like

#InnoDB存储引擎:建议使用VARCHAR类型

单从数据类型的实现机制去考虑,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。

但对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列性能要好。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。

#其他字符串系列(效率:char>varchar>text)

TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT

BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB

BINARY系列 BINARY VARBINARY

text:text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。

mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.

longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.

四、日期类型

DATE TIME DATETIME TIMESTAMP YEAR

作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

============year===========

MariaDB [db1]> create table t10(born_year year); #无论year指定何种宽度,最后都默认是year(4)

MariaDB [db1]> insert into t10 values

-> (1900),

-> (1901),

-> (2155),

-> (2156);

MariaDB [db1]> select * from t10;

+-----------+

| born_year |

+-----------+

| 0000 |

| 1901 |

| 2155 |

| 0000 |

+-----------+

============date,time,datetime===========

MariaDB [db1]> create table t11(d date,t time,dt datetime);

MariaDB [db1]> desc t11;

+-------+----------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+-------+

| d | date | YES | | NULL | |

| t | time | YES | | NULL | |

| dt | datetime | YES | | NULL | |

+-------+----------+------+-----+---------+-------+

MariaDB [db1]> insert into t11 values(now(),now(),now());

MariaDB [db1]> select * from t11;

+------------+----------+---------------------+

| d | t | dt |

+------------+----------+---------------------+

| 2017-07-25 | 16:26:54 | 2017-07-25 16:26:54 |

+------------+----------+---------------------+

============timestamp===========

MariaDB [db1]> create table t12(time timestamp);

MariaDB [db1]> insert into t12 values();

MariaDB [db1]> insert into t12 values(null);

MariaDB [db1]> select * from t12;

+---------------------+

| time |

+---------------------+

| 2017-07-25 16:29:17 |

| 2017-07-25 16:30:01 |

+---------------------+

============注意啦,注意啦,注意啦===========

1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入

2. 插入年份时,尽量使用4位值

3. 插入两位年份时,<=69,以20开头,比如50, 结果2050

>=70,以19开头,比如71,结果1971

MariaDB [db1]> create table t12(y year);

MariaDB [db1]> insert into t12 values

-> (50),

-> (71);

MariaDB [db1]> select * from t12;

+------+

| y |

+------+

| 2050 |

| 1971 |

+------+

============综合练习===========

MariaDB [db1]> create table student(

-> id int,

-> name varchar(20),

-> born_year year,

-> birth date,

-> class_time time,

-> reg_time datetime);

MariaDB [db1]> insert into student values

-> (1,'li',"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"),

-> (2,'wang',"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"),

-> (3,'wsb',"1998","1998-01-01","13:13:13","2017-01-01 13:13:13");

MariaDB [db1]> select * from student;

+------+------+-----------+------------+------------+---------------------+

| id | name | born_year | birth | class_time | reg_time |

+------+------+-----------+------------+------------+---------------------+

| 1 | li | 1995 | 1995-11-11 | 11:11:11 | 2017-11-11 11:11:11 |

| 2 | wang | 1997 | 1997-12-12 | 12:12:12 | 2017-12-12 12:12:12 |

| 3 | wsb | 1998 | 1998-01-01 | 13:13:13 | 2017-01-01 13:13:13 |

+------+------+-----------+------------+------------+---------------------+

# datetime与timesteap的区别

在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。

1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。

2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。

3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。

4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。

mysql> create table t1(x datetime not null default now()); # 需要指定传入空值时默认取当前时间

Query OK, 0 rows affected (0.01 sec)

mysql> create table t2(x timestamp); # 无需任何设置,在传空值的情况下自动传入当前时间

Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1 values();

Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values();

Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;

+---------------------+

| x |

+---------------------+

| 2018-07-07 01:26:14 |

+---------------------+

1 row in set (0.00 sec)

mysql> select * from t2;

+---------------------+

| x |

+---------------------+

| 2018-07-07 01:26:17 |

+---------------------+

1 row in set (0.00 sec)

五、枚举类型与集合类型

字段的值只能在给定范围中选择,如单选框,多选框

enum 单选只能在给定的范围内选一个值,如性别 sex 男male/女female

set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

枚举类型(enum)

An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)

示例:

CREATE TABLE shirts (

name VARCHAR(40),

size ENUM('x-small', 'small', 'medium', 'large', 'x-large')

);

INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');

集合类型(set)

A SET column can have a maximum of 64 distinct members.

示例:

CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));

INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

mysql> insert into consumer values

create table consumer(

-> name varchar(50),

-> sex enum('male','female'),

-> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一

-> hobby set('play','music','read','study') #在指定范围内,多选多

-> );

mysql> insert into consumer values

-> ('wang','male','vip5','read,study'),

-> ('li','female','vip1','girl');

mysql> insert into consumer values

select * from consumer;

+------+--------+-------+------------+

| name | sex | level | hobby |

+------+--------+-------+------------+

| wang | male | vip5 | read,study |

| li | female | vip1 | |

+------+--------+-------+------------+

六、约束条件

"""

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) not null;

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

create table student(

id int,

name char(16) not null,

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

)

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

unique

# 单列唯一

create table user1(

id int unique,

name char(16)

);

insert into user1 values(1,'zhang'),(1,'wang') # 报错

insert into user1 values(1,'zhang'),(2,'wang') # 成功

# 联合唯一

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 int not null unique,

addr char(16) not null 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('zhang'),('zhang'),('zhang'); # id字段自动从1开始递增

# 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

补充:

delete from tb1;

强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,

所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录

delete from tb1 where id > 10;

如果要清空表,使用truncate tb1;

作用:将整张表重置,id重新从1开始记录

七、修改表 alter table

语法:

1. 修改表名

ALTER TABLE 表名

RENAME 新表名;

2. 增加字段

ALTER TABLE 表名

ADD 字段名 数据类型 [完整性约束条件…],

ADD 字段名 数据类型 [完整性约束条件…];

ALTER TABLE 表名

ADD 字段名 数据类型 [完整性约束条件…] FIRST;

ALTER TABLE 表名

ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;

3. 删除字段

ALTER TABLE 表名

DROP 字段名;

4. 修改字段

ALTER TABLE 表名

MODIFY 字段名 数据类型 [完整性约束条件…];

ALTER TABLE 表名

CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];

ALTER TABLE 表名

CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

示例:

1. 修改存储引擎

mysql> alter table service

-> engine=innodb;

2. 添加字段

mysql> alter table student10

-> add name varchar(20) not null,

-> add age int(3) not null default 22;

mysql> alter table student10

-> add stu_num varchar(10) not null after name; //添加name字段之后

mysql> alter table student10

-> add sex enum('male','female') default 'male' first; //添加到最前面

3. 删除字段

mysql> alter table student10

-> drop sex;

mysql> alter table service

-> drop mac;

4. 修改字段类型modify

mysql> alter table student10

-> modify age int(3);

mysql> alter table student10

-> modify id int(11) not null primary key auto_increment; //修改为主键

5. 增加约束(针对已有的主键增加auto_increment)

mysql> alter table student10 modify id int(11) not null primary key auto_increment;

ERROR 1068 (42000): Multiple primary key defined

mysql> alter table student10 modify id int(11) not null auto_increment;

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

6. 对已经存在的表增加复合主键

mysql> alter table service2

-> add primary key(host_ip,port);

7. 增加主键

mysql> alter table student1

-> modify name varchar(10) not null primary key;

8. 增加主键和自动增长

mysql> alter table student1

-> modify id int not null primary key auto_increment;

9. 删除主键

a. 删除自增约束

mysql> alter table student10 modify id int(11) not null;

b. 删除主键

mysql> alter table student10

-> drop primary key;

复制表

mysql> create table new_service select * from service;

只复制表结构

mysql> select * from service where 1=2; //条件为假,查不到任何记录

Empty set (0.00 sec)

mysql> create table new1_service select * from service where 1=2;

Query OK, 0 rows affected (0.00 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> create table t4 like employees;

九 删除表

DROP TABLE 表名;

mysql字段约束_mysql数据库之表操作及字段约束条件相关推荐

  1. mysql 字段写入_MySQL为数据表的指定字段插入数据

    username not null 没有默认值/有默认值   insert不插入username字段 均不报错 2014年07月23日21:05    百科369 MySQL为数据表的指定字段插入数据 ...

  2. mysql数据库表复用_MySQL 数据库之表操作

    一.创建表的完整语法 create table 表( 字段名1 类型 [(宽度) 约束条件], 字段名2 类型 [(宽度) 约束条件], 字段名3 类型 [(宽度) 约束条件] ): 1.类型:使用限 ...

  3. php判断mysql表的字段_tp6 获取数据库某个表的所有字段名称_php菜鸟技术天地-CSDN博客...

    $rs = Db::query("show tables"); PHP获取mysql数据表的字段名称和详细信息的一些列命令 SHOW DATABASES //列出 MySQL Se ...

  4. mysql离散查询_mySQL数据库数据查询操作详解

    查询数据: 简单查询: 1.查询所有数据: select * from 表名 #select * from info 查询所有列 2.查询指定列: select code,name from info ...

  5. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  6. mysql sql 字段唯一_MySQL数据库唯一性设置(unique index)

    我们知道在数据库设计中设置成主键的字段是不会重复的.唯一的,但如果有其他字段也需要保持唯一性应该如何设置呢?比如一个保存学生信息的表里要保证每条记录的学号都不同.这时候就需要对该字段设置唯一性. 设置 ...

  7. java根据表名取出字MySQL_mysql取得数据库所有表名和字段注释_MySQL

    bitsCN.com mysql取得数据库所有表名和字段注释 1.取字段注释 Java代码 Select COLUMN_NAME 列名, DATA_TYPE 字段类型, COLUMN_COMMENT ...

  8. 物理机存放mysql实例原则_MySQL数据库规范 (设计规范+开发规范+操作规范)

    I 文档定义 1.1 编写目的 为了在软件生命周期内规范数据库相关的需求分析.设计.开发.测试.运维工作,便于不同团队之间的沟通协调,以及在相关规范上达成共识,提升相关环节的工作效率和系统的可维护性. ...

  9. 2021年大数据Hive(三):手把手教你如何吃透Hive数据库和表操作(学会秒变数仓大佬)

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive数据库和表操作 一.数据库操作 1.创建数据库 2.创建 ...

最新文章

  1. 干货 :数据可视化的10个关键术语
  2. OpenCV Python教程(1、图像的载入、显示和保存)
  3. 又一先锋与世长辞:Dennis Ritchie(C语言之父、Unix之父、图灵奖获得者),享年70岁...
  4. 11.swift 单例
  5. Linux系统环境查看已经登录用户信息及管理
  6. operamasks-ui2.0 +MVC4.0+EF5.0实战之一 开篇及布局控件介绍
  7. php解决跨域问题6,关于php:tp6-通过全局中间件-解决跨域问题
  8. crowd counting_[crowd_counting]-SFCN-CVPR2019amp;amp;GCC dataset
  9. mysql innodbmaxdirtypagespct_【MySQL】值得关注的参数
  10. 九月腾讯,创新工场,淘宝等公司最新面试三十题
  11. windows平板找回完整的电源模式,包括高性能模式
  12. FPGA-超声波避障小车(ego1)
  13. win10繁体字改简体字方法
  14. 1、命题与命题的表示
  15. 学习CC2541开发笔记
  16. 干货 | Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码
  17. how2heap的fastbin_dup_consolidate(包含sleepyholder)
  18. WCE-hash注入工具使用
  19. 《玛丽莲·梦露》我不止性感,还有从底层溯流而上的努力
  20. 微信小程序审核不通过原因和解决办法

热门文章

  1. php 有必要学dede吗,浅谈{dede:php}{/dede:php}的具体用法
  2. NCDA和计算机设计大赛,“未来设计师”全国高校数字艺术设计大赛(NCDA大赛)参赛流程...
  3. python中 FPDF error:Not a PNG file :‘1.png‘
  4. SQL Server安装登录过程中配置管理器无法创建管理单元的解决方法
  5. mysql 聚集函数 比较_mysql-汇总(聚集)函数
  6. html实用模板,html网页布局实用模板.doc
  7. 世嘉新人培训教材 demo环境配置
  8. android盒子连nas,【当贝市场】教你在安卓盒子上用XBMC访问NAS
  9. 计算机组成原理 doc,计算机组成原理A.doc
  10. 阿里云服务器编译ffmpeg