Mysql-DDL库和表的管理 常见数据类 型常见约束
程序员文章站
2022-05-30 17:13:29
...
库和表的管理
#DDL
/*
数据定义语言
库和表的管理
一 库的管理
创建,修改,删除
二 表的管理
创建,修改,删除
创建:create
修改:alter
删除:drop
*/
#库的管理
/*1,库的创建
create database 库名;
*/
#1创建books库
CREATE DATABASE IF NOT EXISTS books;
#2库的修改
RENAME DATABASE books TO 新库名;
#更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;
#3库的删除
DROP DATABASE IF EXISTS books;
#表的管理
#一 表的创建【*】
/*
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
...
列名 列的类型【(长度) 约束】
)
*/
#创建book表
CREATE TABLE IF NOT EXISTS book(
id INT,
bName VARCHAR(20),
price DOUBLE,
authorId INT,
publishDate DATETIME
);
#创建author表
CREATE TABLE author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(10)
);
DESC author
#二 表的修改
/*
alter table 表名 add|drop|modify|change column 列名【列类型,约束】
*/
#修改列名
ALTER TABLE book CHANGE COLUMN publishDate pubDate DATETIME;
#修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP
#添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;
#删除列
ALTER TABLE author DROP COLUMN annual;
#修改表明
ALTER TABLE author RENAME TO book_author
DESC book
#三 表的删除
DROP TABLE IF EXISTS book_author;
SHOW TABLES;
#通用的写法
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 新表名();
#表的复制
SELECT * FROM author
INSERT INTO author VALUES
(1,'盖世凯1','中国'),
(2,'盖世凯2','中国'),
(3,'盖世凯3','中国'),
(4,'盖世凯4','中国');
#1仅仅复制表的结构
CREATE TABLE copy LIKE author;
#2.0复制表的结构+数据
CREATE TABLE copy2
SELECT * FROM author;
#2.1只复制表的部分内容
CREATE TABLE copy3
SELECT id,au_name
FROM author
WHERE nation='中国';
#2.2仅仅复制某些字段
CREATE TABLE copy4
SELECT id,au_name
FROM author
WHERE 0;
#--------------------------------------------------------------
#库和表的练习
#1,创建表dept1
USE test;
CREATE TABLE dept1(
id INT(7),
NAME VARCHAR(25)
);
#2将department中的东西复制过来
CREATE TABLE dept2
SELECT department_id,department_name
FROM myemployees.`departments`
#3创建表emp5
CREATE TABLE emp5(
id INT(7),
first_name VARCHAR(25),
last_name VARCHAR(25),
dept_id INT(7)
);
#4将last_name的长度增加到50
ALTER TABLE emp5 MODIFY COLUMN last_name VARCHAR(50)
#5根据employees创建employees2
CREATE TABLE employees2 LIKE myemployees.`employees`;
#6删除表emp5
DROP TABLE IF EXISTS emp5
#7将表employees2重命名为emp5
ALTER TABLE employees2 RENAME TO emp5
#8在表dept和emp5中添加新的列test_column 并检查所作操作
ALTER TABLE emp5 ADD COLUMN test_column INT;
#9直接删除表emp5中的列dept_id
ALTER TABLE emp5 DROP COLUMN test_column
常见的数据类型
#常见的数据类型
/*
数值型:
整数
小数:
定点数
浮点数
字符型:
较短的文本:char,varchar
较长的文本:text,blob(较长的二进制数据)
日期型:
*/
#整型
/*
分类:
tinyint smallint mediumint int/integer bigint
1 2 3 4 8
特点:
1,如果不设置无符号还是有符号,默认是有符号,如果想要设置无符号,添加unsigned关键字
2,如果插入的数值超出了整型的范围 会报 out of range异常,并且插入临界值
3,如果不设置长度,会有默认的长度
长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用
*/
CREATE TABLE tab_int(
t1 INT(7) ZEROFILL
t2 INT(7) #设置zerofill默认是无符号
)
#小数
/*
1浮点型:
float(M,D)
double(M,D)
2定点型
dec(M,D)
decimal(M,D)
特点:
M和D(1)
M:整数部门+小数部位
D:小数部位
如果超出范围,则插入临界值
M和D(2)
M和D都可以省略
如果是decimal,则M是默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度的
M和D(3)
定点型的精确度较高,如果要求插入数值的精度较高或者 货币运算的话 优先考虑
原则:选择的类型越简单越好,能保存数值的类型越小越好
*/
CREATE TABLE tab_float(
f1 FLOAT,
f2 DOUBLE,
f3 DECIMAL
);
#字符型
/*
较短的文本:char,varchar
较长的文本:text,blob(较长的二进制数据)
特点
写法 M的意思 特点 空间的耗费 效率
char char(M) 最大的字符数 固定长度的字符 比较耗费空间 高
varchar varchar(M) 最大的字符数 可变长度的字符 比较节省 低
*/
#Enum类型
/*
要求插入的值必须属于列表中指定的值之一
*/
CREATE TABLE tab_char(
c1 ENUM('a','b','c')
)
INSERT INTO tab_char VALUES('a')#可以
INSERT INTO tab_char VALUES('A')#不可以
#Set类型
/*
和enum差不多 就是他可以选取多个成员,而enum只能选取一个
*/
#日期型
/*
分类:
date 只保存日期
time 只保存时间
year 只保存年
datetime 保存日期+时间
timestamp 保存日期+时间
特点:
字节 范围 时区等的影响
datetime 8 1000-9999 不受
timestamp 4 1970-2038 受
*/
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 :非空,用于保证该字段的值不能为空eg:姓名,学号
DEFFAULT:默认,用于保证该字段有默认值eg:比如性别
PARIMARY KEY:主键,用于保证该字段具有唯一性,并且非空eg:学号,员工编号
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空eg:座位号
CHECK:检查约束【sql中不支持】eg:年龄,性别
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自主表的关联列的值
在从表添加外键约束,用于引用主表中某列的值
eg:学生的专业编号,员工表的部门编号,都要有一个大的主表来约束
添加约束条件的时机:
1,创建表时
2,修改表时
约束的添加分类:
1,列级约束:六大约束语法上都支持,但外键约束没有效果
2,表级约束:除了非空,默认,其他的都支持
*/
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型,
表级约束
)
CREATE DATABASE students
#一,创建表的时候添加约束
/*
#添加列级约束
语法:直接往 字段名和类型 后面追加约束条件即可
只支持:非空,主键,唯一,默认
*/
USE students
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,#主键
stuName VARCHAR(20) NOT NULL, #非空
gender CHAR(1) CHECK(gender='男' OR gender='女'),#检查
seat INT UNIQUE ,#唯一
age INT DEFAULT 18,#默认约束
majorId INT REFERENCES major(id)#外键
);
/*
#添加表级约束
语法:在各个字段的最下面
只支持:【constraint 约束名】 约束类型(字段名)
*/
CREATE TABLE IF NOT EXISTS 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)#外键
*/
PRIMARY KEY(id),#主键
UNIQUE(seat),#唯一
CHECK(gender ='男' OR gender='女'),#检查
FOREIGN KEY(majorid) REFERENCES major(id)#外键
);
#通用的写法
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE ,
majorid INT,
CONSTRAINT fk FOREIGN KEY(majorid) REFERENCES major(id)
);
CREATE TABLE IF NOT EXISTS major(
id INT PRIMARY KEY,
majorName VARCHAR(20)
);
DESC stuinfo;
SHOW INDEX FROM stuinfo;
DROP TABLE stuinfo;
/*
主键和唯一键的pk
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
主键 yes no 最多一个 可以,不推荐
唯一键 yes no 可以有多个 可以,不推荐
*/
/*
外键:
1,要求在 从表 设置外键关系
2,从表的外键列的类型 和 主表的关联列的类型 要求一致或者兼容,名称没有别的要求
3,主表的关联列必须是一个key(一般时主键或唯一)
4,插入数据时,先插入主表,再插入从表
删除数据时,先删除从表,在删除主表
#4的两种方法
级联删除
alter table stuinfo add constraint fk foreign key(majorid) references major(id) on delete cascade
级联置空
alter table stuinfo add constraint fk foreign key(majorid) references major(id) on delete set null
*/
#一,创建表的时候添加约束
/*
1,添加列级约束
alter table 表名 modity column 字段名 字段类型 新约束
2,添加表级约束
alter table 表名 add 【constraint 约束名】约束类型(字段名) 【外键的引用】
*/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT,
stuname VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT
);
#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 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 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 FOREIGN KEY fk;
/*
位置 支持的约束类型 是否可以起别名
列级约束 列的后面 都支持,外键没有效果 不可以
表级约束 所有列的下面 默认非空不支持,其他支持 可以(主键没有效果)
*/
下一篇: react项目中遇到的几个问题