文章目录
- 一、创建表的格式
- 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)