Day054--MySQL, 创建用户和授权, 数据类型, 枚举和集合, 约束,唯一, 主键,外键

创建用户和授权

1.创建用户:
# 指定ip:192.118.1.1的mjj用户登录
create user 'mjj'@'192.118.1.1' identified by '123';
# 指定ip:192.118.1.开头的mjj用户登录
create user 'mjj'@'192.118.1.%' identified by '123';
# 指定任何ip的mjj用户登录
create user 'mjj'@'%' identified by '123';

2.删除用户
drop user '用户名'@'IP地址';


3.修改用户
rename user '用户名'@'IP地址' to '新用户名'@'IP地址';

4.修改密码
set password for '用户名'@'IP地址'=Password('新密码');

*****进入mysql库, use mysql; 输入
select * from user\G;
查看所有用户*****

对当前的用户授权管理
查看权限
show grants for '用户'@'IP地址';

#授权 mjj用户仅对db1.t1文件有查询、插入和更新的操作
grant select ,insert,update on db1.t1 to "mjj"@'%';

# 表示有所有的权限,除了grant这个命令,这个命令是root才有的。mjj用户对db1下的t1文件有任意操作
grant all privileges  on db1.t1 to "mjj"@'%';
#mjj用户对db1数据库中的文件执行任何操作
grant all privileges  on db1.* to "mjj"@'%';
#mjj用户对所有数据库中文件有任何操作
grant all privileges  on *.*  to "mjj"@'%';

远程连接:
mysql -uskx -P3306 -h 192.168.15.113 -p123

复制表

#即复制表结构 又复制记录
create table t2 select * from db1.t1;

# 只复制表结构,不复制记录
create table t2 select * from db1.t1 where 1>3; #只要后面条件不成立,表示只复制表结构
create table t2 like db1.t1;
 

数据类型

整型 默认是有符号

数据类型 无符号(unsigned)和有符号 用0填充 zerofill

约束的作用: 保证数据的完整性和一致性

  • tinyint [-128~127] 小整数
  • int 整数
  • bigint 极大整数

  • create table t1(id int(4) unsigned,name char(20));


浮点型

  • float 单精度 随着小数位数的增多,不准确
  • double 双精度 随着小数位数的增多.不准确,比float要准确
  • decimal 小数 精准的小数

日期类型

year 年份 (1901~2155)

date 年月日

time 时分秒

datetime 年月日 时分秒 ***

now() sql语言中自带的内容函: 获取当前的时间(根据数据类型)

create table t10(born_year year,intClass datetime);

语法:
        YEAR
            YYYY(1901/2155)

        DATE
            YYYY-MM-DD(1000-01-01/9999-12-31)

        TIME
            HH:MM:SS('-838:59:59'/'838:59:59')

        DATETIME

            YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)

        TIMESTAMP

            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

字符类型

  • char 定长,简单粗暴,浪费空间,存取速度快
  • varchar 变长,精准,节省空间,存取速度慢
  • text 长文本

    length():查看字节数
    char_length():查看字符数

枚举和集合

 create table consumer(
     id int,
     name varchar(50),
     sex enum('male','female','other') default 'male',
     level enum('vip1','vip2','vip3','vip4'),#在指定范围内,多选一
     fav set('play','music','read','study') #在指定范围内,多选多
    );

注意:在sql中使用tinyint(1)来表示boolean类型

完整性约束

作用: 保证数据的完整性和一致性

not null 与 default

  • 如果单独设置not null 不能插入空值
  • 如果即设置了not null,又指定default,可以插入空值,会走default

unique 唯一

单列唯一

create table t4(
    id int not null,
    name char(20) unique
);

create table t4(
    id int not null,
    name char(20),
    unique(name)
);
insert into t4(id,name) values(1,'alex');
insert into t4(id,name) values(1,'wusir');

多列唯一

  • 只要有一列相同,不能插入

    create table t5(
    id int,
    name char(20),
    unique(id),
    unique(name)
    );

联合唯一 ***

  • 多列相同时,不能插入

    create table t6(
    id int,
    name char(20),
    unique(id,name)
    );

应用场景: 选课系统,一个学生可以选择多个课程,一个课程可以被多个学生选择,

student_id course_name

100 '生物'

101 '生物'

100 '化学

primary key

MySQL为什么需要一个主键?

https://blog.csdn.net/shellching/article/details/77367557

化学反应: not null + unique

Mysql版本一个表中只能有一个主键,可以有联合主键,但不能有多列主键

单列主键 不能为空 并且是唯一

# primary key 索引(针对于大量数据) 查询速度要快
create table t7(
    id int primary key,
    name varchar(10) unique
);

create table t8(
    id int not null unique,
    name varchar(10) unique
);

复合主键

create table t9(    
    id int,    
    name varchar(10),
    primary key(id,name)
);

auto_increment 自增量,升序排列,初始值为1,步长为1

create table student(
    id int primary key auto_increment,
    name varchar(20) not null,
    sex enum('male','female') default 'male', 
    ip varchar(20) unique
);

insert into student(name,sex,ip) values ('alex','female','127.0.0.5'),('wusir','male','173.45.32.1');

auto_increment_increment 设置自增值, 也就是步长

auto_increment_offset 设置偏移值,也就是起始量

查看可用的 开头auto_inc的词
mysql> show variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+
rows in set (0.02 sec)
# 步长auto_increment_increment,默认为1
# 起始的偏移量auto_increment_offset, 默认是1

 # 设置步长 为会话设置,只在本次连接中有效
 set session auto_increment_increment=5;

 #全局设置步长 都有效。
 set global auto_increment_increment=5;

 # 设置起始偏移量
 set global  auto_increment_offset=3;

#强调:If the value of auto_increment_offset is greater than that of auto_increment_increment, the value of auto_increment_offset is ignored. 
翻译:如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值会被忽略 

# 设置完起始偏移量和步长之后,再次执行show variables like'auto_inc%';
发现跟之前一样,必须先exit,再登录才有效。

mysql> show variables like'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 5     |
| auto_increment_offset    | 3     |
+--------------------------+-------+
rows in set (0.00 sec)

#因为之前有一条记录id=1
mysql> select * from student;
+----+---------+------+
| id | name    | sex  |
+----+---------+------+
|  1 | xiaobai | male |
+----+---------+------+
row in set (0.00 sec)
# 下次插入的时候,从起始位置3开始,每次插入记录id+5
mysql> insert into student(name) values('ma1'),('ma2'),('ma3');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from student;
+----+---------+------+
| id | name    | sex  |
+----+---------+------+
|  1 | xiaobai | male |
|  3 | ma1     | male |
|  8 | ma2     | male |
| 13 | ma3     | male |
+----+---------+------+

auto_increment_increment和 auto_increment_offset

清空表区分delete和truncate的区别:

delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。

truncate table t1;数据量大,删除速度比上一条快,且直接从零开始。

foreign key ***

外键

# 先创建主表
create table dep(
    id int primary key auto_increment,
    name char(10) unique,
    dep_desc varchar(50) not null
);
# 校区表
create table school(
    id int primary key auto_increment,
    addr varchar not null
)



# 创建从表
create table emp(
    eid int primary key auto_increment,
    name char(10) not null,
    age int not null,
    dep_id int,
    school_id int,
    constraint fk_dep foreign key(dep_id) references dep(id) 
    on delete cascade 
    on update cascade,
     constraint fk_school foreign key(school_id) references school(id) 
    on delete cascade 
    on update cascade
);

insert into dep(name,dep_desc) values('校长部','校长管理有限部门'),('公关部','公关管理有限部门'),('IT部门','IT技术有限部门'),('财务部','管钱很多部门');
insert into emp(name,age,dep_id) 
    values
    ('alex',18,1),
    ('wusir',30,2),
    ('吴老板',20,3),
    ('马老板',18,4),
    ('邱老板',20,2),
    ('女神',16,3);

猜你喜欢

转载自www.cnblogs.com/surasun/p/10002282.html