# DDL使用,数据相关
CREATE TABLE author(
"name" VARCHAR,
'id' INT
);
#数值类型
/*(1)整型
分类:
tinyInt 1字节
smallInt 2
mediumint 3
int 4
bigint
1、如何设置无符号和有符号
(1)默认是有符号,UNSIGNED设置为无符号
(2)如果不设置长度,会有默认长度(显示的最大宽度,不够以0填充,但必须使用zerofill才能显示)
(3)插入的数值超出了整型的范围,会报out of range异常,并且插入边界值
CREATE TABLIE tab_int(
t1 int(7) ZEROFILL //加zerofill,不足长度的会以0填充
t2 int UNSIGNED #默认是有符号,
)
(2)小数
分类:
浮点型:
float(M,D)
double(M,D)
定点型(精度比浮点型更高)
DEC(M,D)
DECIMAL(M,D)
特点:
(1)M-整数部位+小数位数的总位数,
D-小数位数
超过范围,则插入临界值
(2)M\D 都可以省略
如果是decimal,则默认M为10,D默认为0(插入778.83,实际为779)
如果是float 和double则随之插入的数值的精度来决定精度
(3)定点型的精确度较高,如要求插入的数值的精度较高如货币运算则考虑使用
*/
DESC `admin`;
INSERT `admin`(id,`username`,`password`)
VALUES(72,NULL,NULL);
CREATE TABLE inf(
age1 FLOAT,
age2 DOUBLE,
age3 DEC
);
INSERT `inf`(`age1`,`age2`,`age3`)
VALUES(778.833,778.833,778.833); #这里age3存入的是779
ALTER TABLE `inf` MODIFY COLUMN `age2` `age4` FLOAT(10,2);
三、字符型
/*
较短的文本
char(M)
varchar(M) : M最大的字符数
区别:char代表固定空间的字符,比较耗费空间,但效率高---M可以不写,默认为1
varchar 可变长度,比较省,效率低 ---长度变化比较大时,建议使用 ---M必须写
enum\set\binary
较长的文本
enum\set
*/
# 日期型
/* #date 保存日期
\datatime 保存日期时间 4字节
\timestamp 保存年
\time\year
(1)datatime 8个字节 不受时区等的影响
(2)timestamp(时间戳),更加常用
与实际时区有关,更能反映实际的日期
受MySQL版本和sqlMODE的影响
*/
# 常见约束
/* 意义:一种限制,约束表中的数据,为了保证表中的数据的准确性和可靠性
create table 表名(
字段名 字段类型 约束
)
分类:六大约束
NOT NULL :非空。用于保证该字段的值不能为空
比如姓名、学号等
DEFAULT:默认值,用于保证该字段有默认值
比如性别
primary key:主键,用于保证该字段的值具有唯一性,并且非空
学号、员工编号
unique:唯一,保证该字段的值具有唯一性,可以为空
比如座位号
check:检查约束【MySQL不支持,但也不报错】
foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值
在从表添加外键约束,用于引用主表中某列的值
比如学生表的专业编号,员工表的部门编号,员工表的工种编号
添加约束的时机:
1、创建表时
2、修改表时(应该是未添加数据时)
约束的添加分类:
列级约束:
六大约束语法上都支持,但外键约束无效果
表级约束:
除了非空,默认,其他的都支持
一、创建表时添加约束
1、添加列级约束
语法:直接在字段名和类型后面加 约束类型即可
可用:主键、非空、唯一、默认
2、添加表级约束
语法:在各个字段最下面
【constraint 约束名】 约束类型(字段名)
关于主键、唯一的对比:
(1) 保证唯一性 是否允许为空 一个表中可以加多个(主键/唯一) 是否运行组合
主键 ✔ × × 可以
唯一 ✔ 对 可以多个 可以,但不推荐
*/
#(1)创建表时添加约束
CREATE TABLE `myemployees`.newtable(
id INT PRIMARY KEY, #添加主键约束
stuName VARCHAR(20) NOT NULL,#非空约束
#gender CHAR(1) CHECK(gender = '男' OR gender = '女'), #检查约束,不支持
seat INT UNIQUE, #唯一约束
age INT DEFAULT 18#默认约束
);
DESC `newtable`;
#查看`newtable`表中所有索引,包括主键、外键、唯一
SHOW INDEX FROM `newtable`;
·#(2)添加表级约束
/*
通用的写法:
外键、非空、默认、唯一用列级约束
最下面写表级别约束
*/
CREATE TABLE `myemployees`.newtable(
id INT , #添加主键约束
stuName VARCHAR(20) ,#非空约束
#gender CHAR(1) CHECK(gender = '男' OR gender = '女'), #检查约束,不支持
seat INT , #唯一约束
age INT 18#默认约束
#列级约束,外键无效果
CONSTRAINT pk PRIMARY KEY(id),#主键
CONSTRAINT uq UNIQUE(seat)#w唯一键
CONSTRAINT uq UNIQUE(seat)#w唯一键
CONSTRAINT fk_ newtable FOREIGN KEY(majorid) REFERENCES major(id)#w唯一键
#表级约束,非空、默认表级约束无效
);
/*外键
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致,名称无所谓
3、主表的关联列必须是一个key(主键、唯一键)
4、插入数据时,先插入主表;删除时,先删除从表
*/
#修改表时添加约束:
/*(1)添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
(2)添加表级约束
alter Table 表名 add 新约束(列名)
#修改表时删除约束
(1)删除主键
alter table stuinfo drop primary key;
*/
#标识列:
/*
有称为自增长列
含义:可以不用手动插入值,系统提供默认的序列值
*/
# 一、创建表时设置标识列
CREATE TABLE tab_8(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO `tab_8`
VALUES(NULL,"a"); #直接执行插入多行
SET auto_increment_incerment=3; #设置步长为3
/*特点:
1、标识列必须和主键搭配吗?不一定,但要求是一个key
2、一个表可以有几个标识列?最多一个
3、标识列的类型?只能是数值型,一般是int
4、标识列可以设置步长,也可以设置手动设置起始值
二、修改表时设置标识列
三、修改表时设置标识列
*/