1.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.整型:

整形类型占用字节类型取值范围
tinyint1有符号:-128~127
无符号:0~1255
smallint2有符号:-32768~32768
无符号:0~65535
mediumint3有符号:-8388608~8388608
无符号:0~1677215
int、interger4有符号:-2147483648~2147483648
无符号:0~4294967295
bigint8特别大
特别大

特点:
(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日期型

日期和时间类型字节最小值最大值
date41000-01-019999-12-31
datetime81000-01-01 00:00:009999-12-31 23:59:59
timestamp419700101800012038 年的某个时刻
time3-838:59:59838:59:59
year119012155

例子:

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)
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值