06【数据库的约束】_odps的表设置unique index

  • 2)在已有表中添加主键
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);

alter table t1 add primary key(id);

6.2.5 删除主键
-- 语法:
alter table 表名 drop primary key;

-- 删除t1表的主键约束
alter table t1 drop primary key;

-- 查看表详情
desc t1;

-- 给t1表的id列添加一个主键约束
alter table t1 add primary key (id);

-- 查看表详情
desc t1;

在这里插入图片描述

6.2.6 主键自增

主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值,在最大值加1做为主键值。自增长必须是整数类型,而且必须是主键可以使用。

  • 主键自增的语法:
字段名 字段类型 PRIMARY KEY AUTO\_INCREMENT

create table t2(
	id int primary key auto\_increment,		-- 主键并且自增
    city varchar(20)
);

-- 查看表详情
desc t2;

-- 插入数据
-- 错误
insert into t2 values('黑龙江哈尔滨');

-- 执行几次
insert into t2 (city) values('云南昆明');
insert into t2 (city) values('甘肃兰州');
insert into t2 (city) values('青海西宁');
insert into t2 (city) values('山西太原');
insert into t2 (city) values('辽宁沈阳');
insert into t2 (city) values('内蒙古呼和浩特');

select \* from t2;

在这里插入图片描述

  • 修改主键自增的起始值
-- 将主键的起始值设置为100

alter table t2 auto\_increment = 100;


insert into t2(city) values('山东济南');

-- 第二种写法
insert into t2 values(NULL,'吉林长春');

select \* from t2;

在这里插入图片描述

6.2.7 联合主键

主键可以不只一个字段,如果有多个字段组成的主键,称为联合主键。

  • 示例:
create table test(
	id int,
	id2 int,
	city varchar(20),
	primary key(id,id2)			-- id和id2列组合为联合主键
);

insert into test values(1,1,'北京');
insert into test values(1,2,'天津');
insert into test values(1,1,'重庆');			-- 联合主键冲突

6.3 唯一约束

概念:这一列的值不能重复

  • 语法:
字段名 字段类型 UNIQUE

  • 添加实现唯一约束
-- 创建学生表st3, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生

create table t3 (
	id int primary key auto\_increment,
	city varchar(20) unique
);

-- 添加一个同名的学生
insert into t3 (city) values('河北石家庄');

-- ERROR 1062 (23000): Duplicate entry '河北石家庄' for key 'city'
insert into t3 (city) values('河北石家庄');

desc t3;

select \* from t3;

6.4 非空约束

概念:这一列的值必须输入,不能为空

  • 语法:
字段名 字段类型 NOT NULL

create table t4(
	id int,
	province varchar(30),
	city varchar(20) not null			-- 非空约束
);

insert into t4 values(1,'江苏','南京');

-- ERROR 1048 (23000): Column 'city' cannot be null city列不能为空
insert into t4 values(2,'江苏',null);

-- ERROR 1364 (HY000): Field 'city' doesn't have a default value city列没有默认值
insert into t4(id,province) values(2,'江苏');

6.5 默认值

概念:如果某一列没有输入值,使用默认值。如果输入了,则使用输入的值。

  • 语法:
字段名 字段类型 default 默认值

create table t5(
	id int,
	province varchar(20),
	city varchar(20) default '乌鲁木齐'			-- 如果该列没填,默认为乌鲁木齐
);

-- 如果填了以真实的值为准
insert into t5 values(1,'西藏','拉萨');

insert into t5 values(2,'新疆');			-- 报错,不能直接不填city列


-- 可以使用MySQL提供的default关键字
insert into t5 values(3,'新疆',default);

-- 没有填默认为'乌鲁木齐'
insert into t5(id,province) values(2,'新疆');

-- 查询表数据
select \* from t5;

6.6 检查约束

检查约束可以使用一定的范围条件来约束我们的列的值,例如年龄应该在0~120岁之间,性别只能有男或女等;

  • 语法:
create table t6(
	id int,
	name varchar(30),
	age int check(age>0 and age<120),			-- 年龄只在0~120之间
	sex char(1) check('男' or '女') 			-- 性别只能在'男' 和 '女'之间选择
);

-- 数据合格
insert into t6 values(null,'小明',20,'男');


-- 违反年龄的检查约束
insert into t6 values(null,'小黄',0,'男');

-- 违反年龄的检查约束
insert into t6 values(null,'小陈',150,'男');

-- 违反性别的检查约束
insert into t6 values(null,'小王',20,'啊');

在这里插入图片描述

tips:在MySQL5.7版本不支持检查约束,我们了解即可;

MySQL官方文档:https://dev.mysql.com/doc/refman/5.7/en/create-table.html#create-table-indexes-keys

6.7 外键约束

6.7.1 单表的缺点

创建一个员工表包含如下列(id, name, age, dep_name,dep_location),id主键并自动增长,添加5条数据

CREATE TABLE employee (  
	id INT PRIMARY KEY AUTO\_INCREMENT,  
	name VARCHAR(30),  
	age INT,  
	dept_name VARCHAR(30),  
	dept_location VARCHAR(30)  
);  

-- 添加数据 
INSERT INTO employee (name, age, dept_name, dept_location) VALUES 
('小明', 25,'研发部', '贵州贵阳');  
INSERT INTO employee (name, age, dept_name, dept_location) VALUES 
('小龙', 24,'研发部', '贵州贵阳');  
INSERT INTO employee (name, age, dept_name, dept_location) VALUES 
('小红', 20,'研发部', '贵州贵阳');  

INSERT INTO employee (name, age, dept_name, dept_location) VALUES 
('小兰', 26,'销售部', '宁夏银川');  
INSERT INTO employee (name, age, dept_name, dept_location) VALUES 
('小陈', 28,'销售部', '宁夏银川');  
INSERT INTO employee (name, age, dept_name, dept_location) VALUES 
('小赵', 18,'销售部', '宁夏银川');

  • 以上数据表的缺点:

    1. 大量冗余数据出现:研发部、销售部、地址等信息出现了多次
    2. 会出现删除异常,如果研发部一个人都没有那么研发部就不存在了

在这里插入图片描述

  • 解决方案:

把这一张表拆分成两张表,一张表保存员工,另一张表保存部门。两个表之间通过一个外键建立联系。

在这里插入图片描述

-- 主表: 部门表
create table dept(
	id int primary key auto\_increment,
	dept_name varchar(20),
	dept_location varchar(20)
);

-- 添加部门信息
insert into dept (dept_name,dept_location) values ('研发部','贵州贵阳'),('销售部', '宁夏银川');

-- 如果存在就把这个表删除
drop table if exists employee;

-- 员工表
create table employee(
	id int primary key auto\_increment,
	name varchar(20),
	age int,
	dept_id int 	-- 外键的数据类型与主表中的主键相同
);

-- 添加员工信息
INSERT INTO employee (name, age,dept_id) VALUES 
('小明', 25,1),
('小龙', 24,1),
('小红', 20,1),
('小兰', 26,2),
('小陈', 28,2),
('小赵', 18,2);  

  • 问题:当我们在employee的dept_id里面输入不存在的部门,数据依然可以添加,但是并没有对应的部门,实际应用中不能出现这种情况。employee的dept_id中的数据只能是dept表中存在的id
-- 插入3号部门的员工已经可以正常执行
INSERT INTO employee (name, age,dept_id) VALUES ('小黄',23,3);

在这里插入图片描述

6.7.2 什么是外键约束

部门与员工之间是一对多的关系,一个部门对应多个员工,一个员工属于一个部门。部门是1方,员工是多方。

  • 主表: 是一方,部门表
  • 从表: 是多方,员工表
  • 什么是外键:外键出现在从表中,被主表的主键约束的那一列外键

在这里插入图片描述

6.7.3 创建外键
  • 新建表时增加外键-语法:
[CONSTRAINT `外键名`] FOREIGN KEY(外键字段) REFERENCES 主表(主键)

  • 示例代码:
-- 删除员工表(从表)
drop table employee;

-- 创建员工表(id,name,age,dep\_id)

create table employee(
	id int primary key auto\_increment,
	name varchar(20),
	age int,
	dept_id int, -- 外键的数据类型与主表中的主键相同
	CONSTRAINT `employee\_ibfk\_1` foreign key (dept_id) references dept(id)		-- 本表的dept\_id列依赖于dept表的id列
);

-- 添加员工信息
INSERT INTO employee (name, age,dept_id) VALUES 
('小明', 25,1),
('小龙', 24,1),
('小红', 20,1),
('小兰', 26,2),
('小陈', 28,2),
('小赵', 18,2);  

-- 违反外键约束
INSERT INTO employee (name, age,dept_id) VALUES ('小黄',23,3);
/\*
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db01`.`employee`, CONSTRAINT `employee\_ibfk\_1` FOREIGN KEY (`dept\_id`) REFERENCES `dept` (`id`))
\*/

-- 添加3号部门
insert into dept values(3,'行政部','陕西西安');

-- 再次添加员工并指定为三号部门
INSERT INTO employee (name, age,dept_id) VALUES ('小黄',23,3);

select \* from employee;

select \* from dept;

在这里插入图片描述

  • 已有表增加外键-语法:
# 新增:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (外键字段) REFERENCES 主表(主键)

  • 示例代码:
-- 添加约束
alter table employee add constraint employee_ibfk_1 foreign key(dept_id) references dept(id);

-- 查看表的建表语句
show create table employee;

在这里插入图片描述

6.7.4 删除外键
  • 语法:

如何自学黑客&网络安全

黑客零基础入门学习路线&规划

初级黑客
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!

7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.

如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。

8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。
img

网络安全工程师企业级学习路线

img
如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的

视频配套资料&国内外网安书籍、文档&工具

当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

img
一些笔者自己买的、其他平台白嫖不到的视频教程。
img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值