MySQL
Posted 秃头专业计算机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL相关的知识,希望对你有一定的参考价值。
常见的数据类型
整型
类型 | tinyint |
smallint |
mediumint |
int/integer |
bigint |
字节数 |
1 |
2 | 3 |
4 | 8 |
特点:
① 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
② 如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值
③ 如果不设置长度,会有默认的长度。长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用。如果使用ZEROFILL,默认为整数,就无法使用UNSIGNED。
#1.如何设置无符号和有符号
DROP TABLE IF EXISTS tab_int ;
CREATE TABLE tab_int (t1 INT (7) UNSIGNED, t2 INT (7) ZEROFILL);
DESC tab_int ;
INSERT INTO tab_int VALUES (- 123456) ;
INSERT INTO tab_int VALUES (- 123456, - 123456) ;
INSERT INTO tab_int VALUES (2147483648, 4294967296) ;
INSERT INTO tab_int VALUES (123, 123) ;
SELECT * FROM tab_int ;
浮点型
浮点型又分为浮点数和定点数
浮点数包括float(M,D)和double(M,D),定点数包括DEC(M,D)和DECIMAL(M,D)
float(M,D) |
double(M,D) |
DEC(M,D)和DECIMAL(M,D) |
4 |
8 |
M+2 |
特点:
①M代表整数部位+小数部位的个数,D代表小数部位
②如果超出范围,则报out or range异常,并且插入临界值
③M和D都可以省略,但对于定点数,M默认为10,D默认为0
④如果精度要求较高,则优先考虑使用定点数
CREATE TABLE tab_float (f1 FLOAT(5,2), f2 DOUBLE(5,2), f3 DECIMAL) ;
SELECT * FROM tab_float ;
DESC tab_float ;
INSERT INTO tab_float VALUES(123.45,123.45,123.4523);
#原则:
#所选择的类型越简单越好,能保存数值的类型越小越好
字符型
较短的文本使用char、varchar。binary和varbinary用于保存较短的二进制,enum用于保存枚举,set用于保存集合。较长的文本使用text、blob(较大的二进制)
CREATE TABLE tab_char(
c1 ENUM('a','b','c')
);
INSERT INTO tab_char VALUES('a');
INSERT INTO tab_char VALUES('b');
INSERT INTO tab_char VALUES('c');
INSERT INTO tab_char VALUES('m');#无法插入
INSERT INTO tab_char VALUES('A');#可以插入,不区分大小写
SELECT * FROM tab_set;
CREATE TABLE tab_set(
s1 SET('a','b','c','d')
);
INSERT INTO tab_set VALUES('a');
INSERT INTO tab_set VALUES('A,B');#不区分大小写
INSERT INTO tab_set VALUES('a,c,d');
日期型
类型 |
date |
datetime |
timestamp |
time |
year |
字节 |
4 |
8 | 4 |
3 |
1 |
date只保存日期;time 只保存时间;year只保存年;datetime保存日期+时间;timestamp保存日期+时间;
CREATE TABLE tab_date(
t1 DATETIME,
t2 TIMESTAMP
);
INSERT INTO tab_date VALUES(NOW(),NOW());
SELECT * FROM tab_date;
#显示时区
SHOW VARIABLES LIKE 'time_zone';
#设立时区
SET time_zone='+9:00';
常见约束
约束可以看作一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。一共有六大约束:
NOT NULL:非空,用于保证该字段的值不能为空
DEFAULT: 默认,用于保证该字段有默认值
PRIMARY KEY: 主键,用于保证该字段的值具有唯一性,并且非空
CHECK: 检查约束【mysql中不支持】
UNIQUE: 唯一,用于保证该字段的值具有唯一性,可以为空
FOREIGN KEY: 外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中某列的值
约束的添加分类:列级约束、表级约束。列级约束六大约束语法都支持,但外键约束没有效果,且在MySQL中不支持CHECK。表级约束除了非空、默认,其它的都支持。
创建表时添加约束
添加列级约束:直接在字段名和类型后面追加约束类型即可
#添加列级约束
CREATE TABLE stuinfo(
id INT PRIMARY KEY,#主键
stuName VARCHAR(20) NOT NULL UNIQUE,#非空
gender CHAR(1) CHECK(gender='男' OR gender ='女'),#检查,MySQL不支持
seat INT UNIQUE,#唯一
age INT DEFAULT 18,#默认约束
majorId INT REFERENCES major(id)#外键,看不到效果
);
CREATE TABLE major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
#查看stuinfo中的所有索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo
添加表级约束:在各个字段的最下面【constraint 约束名】约束类型(字段名)
#添加表级约束
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id),#主键
CONSTRAINT uq UNIQUE(seat),#唯一键
CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),#检查
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键
);
SHOW INDEX FROM stuinfo;
通用的写法:
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuname VARCHAR(20),
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
create table 表名(
字段名 字段类型 not null,#非空
字段名 字段类型 primary key,#主键
字段名 字段类型 unique,#唯一
字段名 字段类型 default 值,#默认
constraint 约束名 foreign key(字段名) references 主表(被引用列)
);
#列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求
主键和唯一的区别:
外键:1、要求在从表设置外键关系。2、从表的外键列的类型和主标的关联列的类型要求一致或兼容。3、主表的关联列必须是一个key(主键或唯一)。4、插入数据时,先插入主表,再插入从表。删除数据时,先删除从表,再删除主表。
修改表时添加约束
1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2、添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT
);
DESC stuinfo;
#1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
#2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#3.添加主键
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#②表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
#4.添加唯一
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#②表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);
#5.添加外键
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
修改表时删除约束
#1.删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
#2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;
#3.删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;
#4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;
#5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
SHOW INDEX FROM stuinfo;
标识列:又称为自增长列。可以不用手动的插入值,系统提供默认的序列值
一、创建表时设置自增长列
create table 表(
字段名 字段类型 约束 auto_increment
);
二、修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment;
三、删除自增长列
alter table 表 modify column 字段名 字段类型 约束;
特点:
1.不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment=值;
2.一个表至多有一个自增长列
3.自增长列只能支持数值型
4.自增长列必须为一个key(主键或唯一,外键)
#一、创建表时设置标识列
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT ,
NAME FLOAT UNIQUE AUTO_INCREMENT,
seat INT
)
INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');
SELECT * FROM tab_identity;
SHOW VARIABLES LIKE '%auto_increment%';
#设置
SET auto_increment_increment=3;
#修改表时设置标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT
以上是关于MySQL的主要内容,如果未能解决你的问题,请参考以下文章
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段
使用 json rereiver php mysql 在片段中填充列表视图
关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段