MySQL基础知识一:数据表的创建、维护、删除

1.创建数据表

1.1 数据类型

1)字符类型

数据类型是否需要声明长度实际存储长度空余部分处理适用情况
char声明时定义的长度自动补空格字符长度固定
varchar实际值的长度+1 / +2不处理字符长度可能很大也可能很小,但最大长度已知
text×实际值的长度+2不处理不知道最大长度

数据的检索效率:char>varchar>text

charvarchartext最大存储的字节数均为65535,采用utf8编码可保存65535/3=21844个字符;采用utf8mb4编码可保存65535/4=16383个字符

不同大小text数据类型大小(字节)
tinytext256
text65535
mediumtext16777215
longtext4294967295
  • char数据类型

char类型用于存储固定长度的字符串。声明时指定最大字符串长度,此后一直不变。(若赋予长度较短的值,空余部分用空格自动填充

  • varchar数据类型(最常用)
  1. varchar存储变化长度字符串。该类型字段的长度会根据实际字符数据的长度自动调整。(该列的字符串长度小于定义时的长度,空余部分不会使用空格填充。)
  • 当varchar长度在0-255字节时,该类型实际长度为值的实际长度+1,用一个字节保存实际使用的长度
  • 当varchar长度大于255字节时,该类型实际长度为值的实际长度+2,用2个字节保存实际使用的长度
  1. mysql5.0.3以前版本varchar(n)中的n表示字节数;mysql5.0.3以后版本varchar(n)中的n表示字符数。最大长度为65535字节。采用utf8编码可保存65535/3=21844个字符;采用utf8mb4编码可保存65535/4=16383个字符
  • text数据类型

存储变化长度的字符串。事先并不知道最大长度是多少,例如简介、文章内容等情况。

2)时间和日期类型

时间和日期类型占用空间日期格式最小值最大值零值表示
datetime8 字节YYYY-MM-DD hh:mm:ss1000-01-01 00:00:009999-12-31 23:59:590000-00-00 00:00:00
timestamp4 字节YYYY-MM-DD hh:mm:ss197001010800012038 年的某个时刻00000000000000
date4 字节YYYY-MM-DD1000-01-019999-12-310000-00-00
time3 字节hh:mm:ss-838:59:59838:59:5900:00:00
year1字节YYYY190121550000

DEFAULT CURRENT_TIMESTAMP 可在创建表的时候指明默认值为当前系统时间

  • datetime数据类型(最常用)

表示年月日时分秒。是date与time的结合。与时区无关,记录日期年份长。默认null。
1.只保存格式正确的日期,因此可保存非法日期。

1)1000-00-00 00:00:00 √
2)9999-00-00 00:00:00 √
3)9999-13-00 00:00:00 ×月份最大12
4)9999-00-32 00:00:00 ×日期最大31

  • timestamp数据类型

表示年月日时分秒。对应的数字值表示时间戳。与时区相关,更能反映当前时间,记录日期年份短。默认null。
1.插入日期时会先转换为本地时区后再存放;当查询日期时,会将日期转换为本地时区后再显示。所以不同时区的人看到的同一时间是不一样的。
2.只保存合法的日期,且日期不能早于1970年,不能晚于2037年

1)2000-00-00 00:00:00 ×不存在0月和0日,错误日期
2)1900-01-12 00:00:00 ×日期早于1970年
3)2038-12-31 00:00:00 ×日期晚于2037年

3)数值数据类型

  • decimal数据类型

可表示自定义精度的小数。decimal(m,n) 前者m表示整数位的位数,后者n表示小数位的位数。

decimal(5,1)可表示的范围是-99999.9 到 99999.9

4)enum数据类型

不推荐使用。可以用tinyint代替
1.容易混淆 因为enum底层是用整型保存的,每个枚举值都有一个对应的索引,从 1 开始。如果用 enum 来存储字符串 ‘3’、‘2’、‘1’ 这样的数字字符串,那对应的索引就是 1、2、3,要是不熟悉的开发人员,很容易就会造成混淆,新增错误的数据。
2.修改字段频繁 每增加一个类型就需要修改当前字段,代价太大。一般这种存储类型的字段建议用 tinyint 来存储。

1.2 创建数据表sql命令

create table user_table(
	user_id int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
	username varchar(20) NOT NULL UNIQUE COMMENT '用户名',
	sex enum('男','女') NOT NULL,
	create_datetime datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);
create table book_table(
	book_id int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
	bookname varchar(20) NOT NULL UNIQUE 
);
create table buy_table(
	user_id int(10),
	book_id int(10) NOT NULL,
	PRIMARY KEY(user_id,book_id),
	FOREIGN KEY(user_id) REFERENCES user_table(user_id),
	FOREIGN KEY(book_id) REFERENCES book_table(book_id)
);
  • AUTO_INCREMENT 自增
  • PRIMARY KEY 主键
  • UNIQUE 唯一
  • NOT NULL 非空
  • FOREIGN KEY 外键
  • COMMENT 注释
  • NOT NULL 非空
  • DEFAULT 默认

2.维护数据表

2.1 增加、修改和删除字段

1)增加一个/多个字段

ALTER TABLE book_table ADD(price DECIMAL(5,1),publisher VARCHAR(255));
  • 若声明VARCHAR(255)则不能添加UNIQUE约束,会报错[Err] 1071 - Specified key was too long; max key length is 767 bytes
    该错表明超出索引字节的限制,这是由于在MySQL 5.5中引入了innodb_large_prefix,用来禁用大型前缀索引。对于使用REDUNDANT或COMPACT行格式的InnoDB表,索引键前缀长度限制为767字节。在utf8mb4字符编码中,767/4 = 191个字符,故该唯一字段不能超过191个字符。

2)修改字段属性

ALTER TABLE book_table MODIFY price DECIMAL(5,2);

3)修改字段名称

ALTER TABLE book_table CHANGE publisher publish VARCHAR(50) NOT NULL;
  • 相当于删除该字段重新建一个新字段

4)删除一个字段

ALTER TABLE book_table DROP COLUMN price;

5)删除多个字段

ALTER TABLE book_table DROP COLUMN bookname,DROP COLUMN publisher;

2.2 增加、修改和删除约束

1)增加匿名主键约束

ALTER TABLE book_table ADD PRIMARY KEY(book_id);

2)增加匿名外键约束

ALTER TABLE buy_table ADD FOREIGN KEY(user_id) REFERENCES user_table(user_id);

3)增加自命名主键约束

ALTER TABLE user_table ADD CONSTRAINT user_id_pk PRIMARY KEY(user_id);

4)增加自命名外键约束

ALTER TABLE book_table ADD CONSTRAINT user_id_fk FOREIGN KEY(user_id) REFERENCES user_table(user_id);

5)增加唯一约束

ALTER TABLE book_table ADD UNIQUE(user_id);

6)删除主键约束

ALTER TABLE book_table DROP PRIMARY KEY;
  • 在该主键字段没有设置为自增时可以删除,如果设置为自增,则报错
    [Err] 1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

7)根据外键名删除外键约束

ALTER TABLE buy_table DROP FOREIGN KEY buy_table_ibfk_1;

3.删除数据表

3.1 仅删除数据

DELETE FROM user_table;
  • 当有外键且已有关联数据时,无法删除所关联的数据,需要解除约束关系才可以删除

3.2 删除结构和数据

DROP TABLE user_table;
  • 当有外键且已有关联数据时,无法删除该表,需要解除约束关系才可以删除
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验六 MySQL数据库系统的管理与维护 一、实验目的 熟练掌握MySQL数据库的基础知识及常用的MySQL操作命令与用户权限管理。 二、实验环境 Red Hat Linux 9操作系统。 三、实验结果 每位同学登录数据库服务器,建立自己的用户并授予不同的权限;使用不同的用户登 录数据库,进行相关操作。 四、实验前准备 1、在linux下,建立/lx文件夹,/lx/文件夹下建立文件input.txt,内容如下: 注意,数据之间的分隔符使用Tab键输入 #vi /lx/input.txt \n 赵刚 19 天津 \n 张强 21 南京 \n 苏彤彤 18 北京 \n 徐志林 19 南京 \n 刘海 20 福州 存盘退出 2、连接和断开数据库 连接数据库 #mysql -h主机IP地址 -u用户名 –p 输入该用户密码,如果连接成功,出现以下提示符: mysql> 断开数据库 mysql>quit(或exit); # 五、实验内容及步骤 1、在客户端以adminroot用户登录数据库服务器 #mysql -h 数据库服务器的IP地址 -u adminroot -p 输入密码: mysql> 出现mysql提示符,说明登录数据库服务器成功。 建立如下用户并授予相应的权限: (1) 建立用户useradmin序号,具有对数据库sydata序号操作的所有权限,密码为'123',登录 的主机为任意客户端 mysql>grant all on sydata序号.* to useradmin序号@'%' identified by '123'; (2) 建立用户isuser序号,具有对数据库sydata序号插入,检索权限,密码为'234',登录的主 机为任意客户端 mysql>grant insert,select on sydata序号.* to isuser序号@'%' identified by '234'; (3) 建立用户ususer序号,具有对数据库sydata序号更新,检索权限,密码为'345',登录的主 机为任意客户端 mysql>grant update,select on sydata序号.* to ususer序号@'%' identified by '345'; (4) 建立用户sduser序号,具有对数据库sydata序号删除,检索权限,密码为'456',登录的主 机为任意客户端 mysql>grant delete,select on sydata序号.* to sduser序号@'%' identified by '456'; mysql>exit; //退出数据库 2、在客户端以useradmin序号用户登录数据库服务器,创建数据库sydata序号,在该数据 库中建立表sytable,表列为 id:int(3),name:char(6),age:int(2),addr:varchar(50). 其中id为主键,不能为空并且为自动增一,name和age不能为空,addr缺省值为大连市. (1) 登录数据服务器 #mysql -h 数据库服务器的IP地址 -u useradmin序号 -p 输入密码 mysql> 出现mysql提示符,说明登录数据库服务器成功 (2) 创建数据库sydata序号,并在其中创建表sytable mysql>create database sydata序号; //创建数据库 mysql>show databases; //显示数据库 mysql>use sydata序号; //打开数据库 mysql>create table sytable (id int(3) auto_increment not null primary key,name char(6) not null,age int(2) not null,addr varchar(50) default '大连市'); //创建表 建立成功后,查询表sytable结构 mysql>describe sytable; //查询表结构 如果正确,转向步骤(3);如果不正确,要修改表sytable结构,使其满足题中的要求 mysql>alter table sytable 修改的字段; mysql>exit; 3、在客户端以isuser序号用户登录数据库服务器,向表sytable中插入二条记录,('李红 ',20,'沈阳市'),('王燕',19,'上海市') #mysql -h 数据库服务器的IP地址 -u isuser序号 -p 输入密码 mysql> mysql>use sydata序号; //打开数据库 mysql>insert into sytable (name,age,addr) values('李红',20,'沈阳市

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值