文章目录

  • 一、创建表的格式
  • 1.创建表的语法
  • 2.约束条件
  • 3.添加约束条件的时机
  • 4.添加约束的分类
  • 例子1:添加列约束
  • 二.mysql数值型
  • 1.整型:
  • 整形长度显示问题
  • 2.小数:
  • 写法1:
  • 写法2:
  • 三、mysql字符型
  • 1.char varchar
  • (1)char :固定长度的字符。
  • (2)varchar:可变长度的字符
  • 2.text blob
  • 四、mysql日期型


一、创建表的格式

1.创建表的语法

#这里的长度和约束条件可以省略,根据需要添加
create table 表名称 (
	字段1名称 数据类型(长度) 约束条件
	字段2名称 数据类型(长度) 约束条件
	字段3名称 数据类型(长度) 约束条件
	......
)

2.约束条件

约束条件就是 一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
六大约束条件:
(1)not null: 非空 用于保证该字段的值不能为空
(2)default:默认 用于保证该字段有默认值
语法:default 默认值

(3)primary key:主键 用于保证该字段的值具有唯一性 并且不能为空
(4)unique: 唯一 用于保证该字段的值具有唯一性 但是值可以为空
(5)check:检查约束 mysql中不支持
(6)foreign key:外键 用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值

3.添加约束条件的时机

(1)创建表时
(2)修改表时

4.添加约束的分类

(1)列级约束
六大约束在语法上都支持,但是外键约束没有效果

(2)表级约束
除了非空、默认 其它的都支持
一般在创建表时 所有字段的最下面

语法:
	constraint 约束名 约束类型(字段名)

constraint 约束名可以省略,如果省略 约束名就会和字段名相同。但是在设置多个外键的表约束的时候需要起名字。

例子1:添加列约束
mysql> create table tab_yueshu ( id int primary key, name char(10) not null, gender int default 18,class int);
Query OK, 0 rows affected (0.01 sec)

mysql> desc tab_yueshu;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id     | int(11)  | NO   | PRI | NULL    |       |
| name   | char(10) | NO   |     | NULL    |       |
| gender | int(11)  | YES  |     | 18      |       |
| class  | int(11)  | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+

先测试default约束条件.

#我们没有插入年龄数据,数据保持了默认值
mysql> insert into tab_yueshu (id,name) values(1,"zhangsan");
Query OK, 1 row affected (0.00 sec)

mysql> select * from tab_yueshu;
+----+----------+--------+-------+
| id | name     | gender | class |
+----+----------+--------+-------+
|  1 | zhangsan |     18 |  NULL |
+----+----------+--------+-------+
1 row in set (0.00 sec)

在测试primary key约束条件

#这里直接报错了,说关键字1重复了
mysql> insert into tab_yueshu (id,name) values(1,"lisi");
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

在测试not null约束条件

mysql> insert into tab_yueshu (id) values (2);
ERROR 1364 (HY000): Field 'name' doesn't have a default value

二.mysql数值型

1.整型:

整形类型

占用字节

类型取值范围

tinyint

1

有符号:-128~127

无符号:0~1255

smallint

2

有符号:-32768~32768

无符号:0~65535

mediumint

3

有符号:-8388608~8388608

无符号:0~1677215

int、interger

4

有符号:-2147483648~2147483648

无符号:0~4294967295

bigint

8

特别大

特别大

特点:
(1)字段类型为整型时(以上所有类型),插入的数据值默认是有符号的数据,如果想要设置无符号类型需要加上unsigned。
例子1:有符号数据测试

mysql> create database sqldb;
mysql> create table test(date int);
mysql> desc test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| date  | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

插入数据测试:正负数据都可以正常插入。

mysql> insert into test values(100),(-100);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from test;
+------+
| date |
+------+
|  100 |
| -100 |
+------+

例子2:无符号数据测试

mysql> create table test1 (data int unsigned);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test1;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| data  | int(10) unsigned | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

插入数据:

mysql> insert into test1 values (100);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test1;
+------+
| data |
+------+
|  100 |
+------+
1 row in set (0.00 sec)

当插入有符号数据时就会报错

mysql> insert into test1 values (-100);
ERROR 1264 (22003): Out of range value for column 'data' at row 1
整形长度显示问题
mysql> create table tab_int (date int(5));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tab_int values(110),(1345),(14573565);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

在创建表时,数据类型的定义的int(5)这里的不是限制了数据的大小,而是限制数据的显示位数.

mysql> select * from tab_int;                                           
+----------+
| date     |
+----------+
|      110 |
|     1345 |
| 14573565 |
+----------+
3 rows in set (0.00 sec)
#我们发现这里的并没有只显示5位

要想Int(5)生效 必须规定int为无符号的整数,还要加上zerofill关键字

mysql> create table tab_int (data int(5) unsigned zerofill);
Query OK, 0 rows affected (0.01 sec)

mysql> desc tab_int;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type                     | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| data  | int(5) unsigned zerofill | YES  |     | NULL    |       |
+-------+--------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into tab_int values (1),(12),(110),(1234567);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from tab_int;
+---------+
| data    |
+---------+
|   00001 |
|   00012 |
|   00110 |
| 1234567 |
+---------+

这里看出了int(5)的含义就是数字不够5为的时候用0补齐5位

2.小数:

定点数:
float(4字节)
double(8字节)

浮点型:
decimal(可以简写为dec)

写法1:

在创建表的时候,使用默认的写法,什么都不指定

mysql> create table tab_f (
    -> f1 float,
    -> f2 double,
    -> f3 dec
    -> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc tab_f;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| f1    | float         | YES  |     | NULL    |       |
| f2    | double        | YES  |     | NULL    |       |
| f3    | decimal(10,0) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

#插入数据
mysql> insert into tab_f values (3.14,12345.111,12345678.12345678);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from tab_f;
+------+-----------+----------+
| f1   | f2        | f3       |
+------+-----------+----------+
| 3.14 | 12345.111 | 12345678 |
+------+-----------+----------+
1 row in set (0.00 sec)
写法2:

在创建表的时候,指定长度。 以下格式float double dec都通用

float(数字总长度,小数点长度)

例子:

mysql> create table tab_f2 ( data float(5,2));
Query OK, 0 rows affected (0.00 sec)

mysql> desc tab_f2;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| data  | float(5,2) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.01 sec)


mysql> insert into tab_f2 values (3.14);
mysql> insert into tab_f2 values (123.14);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tab_f2;
+--------+
| data   |
+--------+
|   3.14 |
| 123.14 |
+--------+
2 rows in set (0.00 sec)

注意:因为总长度为5位,小数点后边长度为2位。但是插入的时候为4为小数,那就会保留2位 四舍五入

mysql> insert into tab_f2 values (123.1456);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tab_f2;
+--------+
| data   |
+--------+
|   3.14 |
| 123.14 |
| 123.15 |
+--------+
3 rows in set (0.00 sec)

三、mysql字符型

1.char varchar

char varchar适用比较短的文本

(1)char :固定长度的字符。

写法: char(字符串长度) 如果长度不写,默认为1个字符的长度
解释:固定字符串长度就是 比如我们规定的是char(10),但是我们只插入了3个字符,数据库依然还是开辟10个字符的空间。

(2)varchar:可变长度的字符

写法: varchar(字符串长度) 长度不能省略
解释:可变长度就是 比如我们规定的是varchar(10),但是我们只插入了3个字符,数据库就只开辟3个字符的空间。

2.text blob

text blob适用比较长的文本

四、mysql日期型

日期和时间类型

字节

最小值

最大值

date

4

1000-01-01

9999-12-31

datetime

8

1000-01-01 00:00:00

9999-12-31 23:59:59

timestamp

4

1970010180001

2038 年的某个时刻

time

3

-838:59:59

838:59:59

year

1

1901

2155

例子:

mysql> create table tab_date (d1 date,d2 time,d3 datetime,d4 timestamp,d5 year);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tab_date values(now(),now(),now(),now(),now());
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from tab_date;
+------------+----------+---------------------+---------------------+------+
| d1         | d2       | d3                  | d4                  | d5   |
+------------+----------+---------------------+---------------------+------+
| 2020-12-19 | 19:36:30 | 2020-12-19 19:36:30 | 2020-12-19 19:36:30 | 2020 |
+------------+----------+---------------------+---------------------+------+
1 row in set (0.00 sec)