创建表的完整语法,基本数据类型, 枚举与集合类型,约束条件

我与影子孤独终老i 提交于 2019-11-27 22:37:49

 


创建表的完整语法
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
注意:
1.字段名和字段类型是必须的 中括号内的参数都是可选参数
2.同一张表中字段名不能重复
3.最后一个字段后面不能加逗号
create table t6(
id int,
name char,
);

宽度:
使用数据库的准则:能尽量让它少干活就尽量少干活

对存储数据的限制
char(1) 只能存一个字符
如果超了 mysql会自动帮你截取
1.插入的时候 mysql自动截取
2.会直接报错(mysql严格模式)


alter table t5 modify name char not null;
not null该字段不能插空

create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;

insert into t1 values(1);
insert into t2 values(2);
insert into t3 values(3);
insert into t4 values(4);

select * from t1; #
select * from t2;
select * from t3; #关闭服务端数据就消失
select * from t4; #写什么,什么就消失

##建表
mysql> create table t5(id int,name char(2),password int,play char(6));
Query OK, 0 rows affected (0.31 sec)

mysql> desc t5;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(2) | YES | | NULL | |
| password | int(11) | YES | | NULL | |
| play | char(6) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+

##在t5表中插入数据
mysql> insert into t5 values(4,'hang',12344213789456,'粉红色的健康很舒服');
Query OK, 1 row affected, 3 warnings (0.07 sec)

mysql> select * from t5;
+------+------+------------+--------------------+
| id | name | password | play |
+------+------+------------+--------------------+
| 1 | zg | 2147483647 | ballll |
| 1 | ha | 2147483647 | balsdf |
| 3 | zg | 2147483647 | ballll |
| 4 | ha | 2147483647 | 粉红色的健康 |
+------+------+------------+--------------------+
在id=4时,我们可以看到char括号内的数字限制了字符的个数,不管字母或汉字或其他字符一个就算成一个字符,在我自定表字段的时候设置name char(2),实际名字‘hang’是4个字符,被截取我们设定的字符个数;password

#字段可以插空
mysql> desc t5;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(2) | YES | | NULL | |
| password | int(11) | YES | | NULL | |
| play | char(6) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
mysql> insert into t5 value(5,'an',2344789456,'NULL');
Query OK, 1 row affected, 1 warning (0.05 sec)

mysql> select * from t5;
+------+------+------------+--------------------+
| id | name | password | play |
+------+------+------------+--------------------+
| 1 | zg | 2147483647 | ballll |
| 1 | ha | 2147483647 | balsdf |
| 3 | zg | 2147483647 | ballll |
| 4 | ha | 2147483647 | 粉红色的健康 |
| 5 | an | 2147483647 | NULL |
+------+------+------------+--------------------+

#更改表中的某个字段不能为空,设置完以后,
alter table t5 modify name char not null;
not null该字段不能插空如果再插入空,该字段会被插空的地方会被清空。

mysql> alter table t5 modify play char not null;
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> update t5 set play=null where id=1;
Query OK, 2 rows affected, 2 warnings (0.06 sec)
Rows matched: 2 Changed: 2 Warnings: 2

mysql> select * from t5;
+------+------+------------+------+
| id | name | password | play |
+------+------+------------+------+
| 1 | z | 2147483647 | |
| 1 | h | 2147483647 | |
| 3 | z | 2147483647 | b |
| 4 | h | 2147483647 | 粉 |
| 5 | a | 2147483647 | N |
| 6 | z | 12345 | |
+------+------+------------+------+
6 rows in set (0.00 sec)



类型和中括号内的约束
类型约束的是数据的存储类型
而约束是基于类型之上的额外限制

#注意:
1. 在同一张表中,字段名不能相同
2. 宽度和约束条件可选,字段名和类型是必须的
3. 最后一个字段后不能加逗号!

# 补充:
# 1.宽度指的是对存储数据的限制
create table userinfo(name char);
insert into userinfo values('jason');
"""
1.没有安全模式的数据库版本,能够存放数据但是只会存进去一个j
2.最新数据库版本直接报错提示无法存储:Data too long for column 'name' at row 1
"""

# 2.约束条件初识>>> null 与 not null
#设置not null后,char默认只能只能接受1个字符,即,char(1),多余的字符会被清楚掉。
create table t1(id int,name char not null);
insert into t1 values(1,'j'); # 正常存储
insert into t1 values(2,null); # 报错

# 总结 类型与约束条件区别
# 类型:限制字段必须以什么样的数据类型存储
# 约束条件:约束条件是在类型之外添加一种额外的限制

字段类型
整型
SMALLINT TINYINT INT BIGINT

TINYINT
默认是否有符号 默认是带有符号的(-128,127)
超出限制会如何 超出之后只会存最大值或者最小值


create table t6(id TINYINT);


not null 不能为空
unsigned 无正负符号 # 加上unsigned没有负数,区间从零到最大字符数的最大值
zerofill 0填充多余的位数

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

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

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

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

ps:
mysql> create table t15(x int(8) unsigned);
Query OK, 0 rows affected (0.58 sec)

mysql> insert into t15 values(34578352365896);
Query OK, 1 row affected, 1 warning (0.06 sec)

mysql> select * from t15;
+------------+
| x |
+------------+
| 4294967295 |
+------------+

char后面的数字是用来限制存储数据的长度的

特例:只有整型后面的数字不是用来限制存储数据的长度 而是用来控制展示的数据的位数
int(8) 够/超8位有几位存几位,不够8位空格填充

修改约束条件 不够8位的情况下 用0填充


强调:**对于整型来说,数据类型后的宽度并不是存储限制,
而是显示限制,所以在创建表时,
如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据

只要是整型 都不需要指定宽度 因为有默认的宽度 足够显示对应的数据

### 严格模式补充

我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式

模糊匹配
like
%匹配任意多个字符
_匹配任意一个字符

set session 临时有效 只在你当前操作的窗口有效
set global 全局有效 终生有效
set global sql_mode = 'STRICT_TRANS_TABLES';
设置完之后 你只需要重新退出客户端再次进入即可


```python
show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
# 修改安全模式
set session # 只在当前操作界面有效
set global # 全局有效

set global sql_mode ='STRICT_TRANS_TABLES' #设置严格模式语句
# 修改完之后退出当前客户端重新登陆即可
'''
ps:
mysql> create database db2;
Query OK, 1 row affected (0.05 sec)

mysql> use db2;
Database changed
mysql> create table t1(name char(4),id int);
Query OK, 0 rows affected (0.27 sec)

mysql> insert into t1 values('li',1);
Query OK, 1 row affected (0.06 sec)

mysql> select * from t1;
+------+------+
| name | id |
+------+------+
| li | 1 |
+------+------+
1 row in set (0.00 sec)

mysql> insert into t1 values('zhang',2);
ERROR 1406 (22001): Data too long for column 'name' at row 1

以上事例:在我们设置严格模式之后,char(4),在向表中插入字符‘zhang’的时候,字符个数超过了限制,就会报错;

浮点型
float(255,30) 总共255位 小数部分占30位
double(255,30) 总共255位 小数部分占30位
decimal(65,30) 总共65位 小数部分占30位


create table t2(x float(255,30));
create table t3(x double(255,30));
create table t4(x decimal(65,30));
desc t2;
desc t3;
desc t4;
insert into t2 values(1.11111111111111111111111111111111);
insert into t3 values(1.11111111111111111111111111111111);
insert into t4 values(1.11111111111111111111111111111111);
select * from t2;
select * from t3;
select * from t4;

 

mysql> create table t2(x float(255,30));
Query OK, 0 rows affected (0.27 sec)

mysql> create table t3(x double(255,30));
Query OK, 0 rows affected (0.42 sec)

mysql> create table t4(x decimal(65,30));
Query OK, 0 rows affected (0.29 sec)

mysql> desc t2;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| x | float(255,30) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
1 row in set (0.03 sec)

mysql> desc t3;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| x | double(255,30) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.03 sec)

mysql> desc t4;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| x | decimal(65,30) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+

mysql> insert into t2 values(1.11111111111111111111111111111111);
Query OK, 1 row affected (0.06 sec)

mysql> insert into t3 values(1.11111111111111111111111111111111);
Query OK, 1 row affected (0.03 sec)

mysql> insert into t4 values(1.11111111111111111111111111111111);
Query OK, 1 row affected, 1 warning (0.03 sec)

mysql> select * from t2;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t3;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t4;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
精确度
float < double < decimal


#### 字符类型

* 分类
* char(定长)
* varchar(变长)
* 作用:姓名,地址,描述类信息

create table t5(name char(4));
create table t6(name varchar(4));
insert into t5 values('he');
insert into t6 values('he');

select * from t5;
select * from t6;

select char_length(name) from t5;
select char_length(name) from t6; # 仍然无法查看到真正的结果

首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
# 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
# 退出客户端重新登陆


ps:
mysql> set global sql_mode='strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%mode%';
# 退出客户端重新登陆
+----------------------------+---------------------------------------------+
| Variable_name | Value |
+----------------------------+---------------------------------------------+
| binlogging_impossible_mode | IGNORE_ERROR |
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | OFF |
| pseudo_slave_mode | OFF |
| slave_exec_mode | STRICT |
| sql_mode | STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH |
+----------------------------+---------------------------------------------+
select char_length(name) from t5;
select char_length(name) from t6;

mysql> use db2;
Database changed
mysql> select char_length(name) from t5;
+-------------------+
| char_length(name) |
+-------------------+
| 4 |
+-------------------+
1 row in set (0.00 sec)

mysql> select char_length(name) from t6;
+-------------------+
| char_length(name) |
+-------------------+
| 2 |
+-------------------+

char与varchar的区别
char定长
1.浪费空间
2.存取速度快


varchar变长
1.节省空间
2.存取速度慢(较于char比较慢)
存的时候 需要给数据讲一个记录长度的报头
取的时候 需要先读取报头才能读取真实数据
1bytes+egon 1bytes+alex 1bytes+lxx 1bytes+jxx 1bytes+txx


char(4) varchar(4)
取的时候方便 取的时候比较繁琐了 无法知道数据到底多长
直接按固定的长度取即可


#### 时间类型

* 分类

* date:2019-05-01
* time:11:11:11
* Datetime: 2019-01-02 11:11:11
* Year:2019

* 测试

```mysql
create table student(
id int,
name char(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');


枚举与集合类型
枚举(enum) 限制某个字段能够存储的数据内容 枚举enum 多选一
集合(set) 限制某个字段能够存储的数据内容 集合set 多选多

mysql>
mysql> create table user(id int,name char(10),gender enum('male','female','others'));
Query OK, 0 rows affected (0.33 sec)

mysql> desc user;
+--------+--------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| gender | enum('male','female','others') | YES | | NULL | |
+--------+--------------------------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

mysql> insert into user values(1,'zhang','male');
Query OK, 1 row affected (0.06 sec)

mysql> insert into user values(1,'zhang','buming');
#没按限定的内容输入,直接报错。
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> select * from user;
+------+------------+--------+
| id | name | gender |
+------+------------+--------+
| 1 | zhang | male |
+------+------------+--------+


create table teacher(
id int,
name char(10),
gender enum('male','female','other'),
hobby set('read','swim','dbj','walk')
);

insert into teacher values(1,'zhang','male','swim,walk');

select * from teacher;

mysql> create table teacher(
-> id int,
-> name char(10),
-> gender enum('male','female','other'),
-> hobby set('read','swim','dbj','walk')
-> );
Query OK, 0 rows affected (0.29 sec)

mysql> insert into teacher values(1,'zhang','male','swim,walk');
Query OK, 1 row affected (0.10 sec)

mysql> select * from teacher;
+------+------------+--------+-----------+
| id | name | gender | hobby |
+------+------------+--------+-----------+
| 1 | zhang | male | swim,walk |
+------+------------+--------+-----------+
1 row in set (0.00 sec)


## 约束条件

```python
"""
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值

UNSIGNED 无符号
ZEROFILL 使用0填充
"""
```

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!