Home > Database > Mysql Tutorial > body text

MySQL Lecture Three: DDL Data Definition Statement

coldplay.xixi
Release: 2021-02-24 09:10:20
forward
1736 people have browsed it

MySQL Lecture Three: DDL Data Definition Statement

Free learning recommendation: mysql video tutorial

##Article Directory

    1. DDL data definition statement
  • 2. Data type
    • 2.1 Integer type
    • 2.2 Decimal
    • 2.3 Character type
    • 2.4 Date type
  • 2. Six constraints
  • 4. Identity column
  • 5. Cascade deletion and blanking

1. DDL data definition statement

Library management

Create:

create database [if not exists] library name; Modify: If you need to modify the library name, modify the folder directly
Delete:
DROP DATABASE IF EXISTS library name;

Table management

Create

create table IF NOT EXISTS table name(
Column name column type [length, constraint],
Column name column type [length, constraint],
Column name Column type [length, constraints],
...
)

Modify


alter table table Name add|drop|modify|change column column name [column type constraint];

delete


drop table table name;

【库的管理】# 创建库CREATE DATABASE IF NOT EXISTS books;# 修改库的字符集ALTER DATABASE books CHARACTER SET gbk;# 删除库DROP DATABASE IF EXISTS books;【表的管理】# 1.创建表CREATE TABLE IF NOT EXISTS book(
	id INT,
	bName VARCHAR(20),
	authorID INT,
	publishDate DATETIME);DESC book;CREATE TABLE author(
	id INT,
	au_name VARCHAR(20),
	nation VARCHAR(10));DESC author;# 2.修改表# 修改列名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 ADD COLUMN newT1 INT FIRST;# 添加新列在指定的列后ALTER TABLE author ADD COLUMN newT2 INT AFTER newT1;# 删除列ALTER TABLE author DROP COLUMN annual;# 修改表名ALTER TABLE author RENAME TO book_author;# 3.表的删除DROP TABLE IF EXISTS book_author;SHOW TABLES;# 4.表的复制INSERT INTO author VALUES(1,'小樱','日本'),(2,'悟空','中国'),(3,'绿巨人','美国'),(4,'哪吒','中国');# 仅复制表的结构CREATE TABLE author2 LIKE author;# 复制表的结构+数据CREATE TABLE author3 SELECT * FROM author;# 只复制部分数据CREATE TABLE author4 SELECT id,au_name FROM author WHERE nation='中国';# 仅复制某些字段CREATE TABLE author5 SELECT id,au_name FROM author WHERE 1=2;
Copy after login

2. Data type

2.1 Integer type

##Integer typeTinint##Smallinsmall integer type20~65535-32768~32767Mediumint中INTeger30~1677215-8388608~8388607Integer type##-2147483648~2147483647 8##-9223372036854775808~9223372036854775807
【整型】# 1.默认为有符号,可以添加unsigned设置为无符号CREATE TABLE IF NOT EXISTS tab_int(
	t1 INT, # 有符号
	t2 INT UNSIGNED, # 无符号
	t3 INT ZEROFILL #添加zerofill后自动变更为无符号整型,位数不够0填充.);DESC tab_int;SELECT * FROM tab_int;# 2.如果插入的数值超出了整型的范围,会报out of range异常INSERT INTO tab_int VALUES(2147483648,1);# 3.如果不设置长度,会有默认的长度,位数不够时0填充(前提是字段有ZEROFILL).
Copy after login
2.2 Decimal
Alias Bytes Unsigned range Signed range
Microinteger Type 1 0~255 -128~127
##Int or Integer
4 0~4294967295 ##Bigint Bigint
0~9223372036854775807*2 1

Floating point typeBytes

Rangefloat( M,D)4-2^128 ~ 2^128-2^1024 ~ 2^1024Fixed point type\M 2Note: D: the decimal part 1. If it is a decimal type, M defaults to 10 and D defaults to 0; 2. If It is float and double, and the accuracy will be determined based on the accuracy of the inserted value. 3. The fixed-point type has higher accuracy. If you need to insert numerical values ​​with higher accuracy, such as currency operations, consider using it.
##double(M,D) 8
\ ##DEC(M,D)The maximum value range is the same as double. The valid range of a given decimal is determined by M and D
M: integer The total length of the decimal part of the part When both D and M are omitted:


2.3 Character type




String type

Can M be omittedFeatures

Space consumptionEfficiencyRangechar(M)M can be omitted, the default is 1Fixed lengthIt is more expensiveHighM is an integer between 0 and 255varchar(M)M cannot be omittedVariable lengthCompare and saveLowM is an integer between 0 and 65535 ##binaryvarbinary
and types, similar to The difference between char and varchar is that they contain binary characters and not non-binary characters, that is, shorter binary is saved.
Bit(M) type
, bytes are 1~8, and the range is

Bit(1)~Bit(8). Enum type

, which is an enumeration type, requires that the value inserted must belong to one of the values ​​specified in the list. If the column member is
1~255

, it is required 1 byte of storage; if the column members are 255~65535, 2 bytes of storage are required, and up to 65535 members are required.

Set type

, similar to Enum, can save 0~64 members. The biggest difference from Enum is that the Set type can select multiple members at a time, while Enum can only select one. Depending on the number of members, the storage occupies different bytes. Number of members

Number of bytes

1~89~162##17~24325~32433~648
【枚举】CREATE TABLE tab_set(
	s1 SET('a','b','c'));INSERT INTO tab_set VALUES('a');INSERT INTO tab_set VALUES('c,a');INSERT INTO tab_set VALUES('a,b,c');# 插入后,内部会进行排序,如插入c,a会变成a,c
Copy after login

2.4 日期类型

1
日期和时间类型 特点 字节 最小值 最大值
date 只保存日期 4 1000-01-01 9999-12-31
datetime 保存日期+时间 8 1000-01-01 00:00:00 9999-12-31 23:59:59
timestamp(使用较多) 保存日期+时间 4 187001080001 2038年的某个时刻
time 只保存时间 3 -838:59:59 838:59:59
year 只保存年 1 1901 2155

timestamp和实际时区有关,更能反映实际的日期;datetime则只能反映出插入时的当地时区。
timestamp的属性受Mysql版本和SQLMode的影响很大。

【日期类型】CREATE TABLE tab_date(
	t1 DATETIME, # 不受时区影响
	t2 TIMESTAMP # 受时区影响);INSERT INTO tab_date VALUES(NOW(),NOW());SET time_zon='+8:00';# 设置时区SHOW VARIABLES LIKE 'time_zone'; #显示当前时区
Copy after login

二、六大约束

含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性。

NOT NULL 非空约束,规定某个字段不能为空
UNIQUE 唯一约束,规定某个字段在整个表汇中是唯一的
PRIMARY KEY 主键(唯一且非空)
FOREIGN KEY 外键
CHECK 检查约束(mysql中不支持)
DEFAULT 默认值,保证该字段有默认值

列级约束:六大约束语法上都支持,但外键约束没有效果。

表级约束:除了非空、默认,其他都支持。

常用的做法是:其他约束都写在列级,外键约束写在表级。

主键和唯一对比 是否保证唯一性 是否允许为空 允许有几个 是否允许组合(不推荐)
主键 × 至多一个主键 允许组合主键
唯一 √(允许有一个null) 可以有多个唯一 允许组合唯一

外键的特点:

  • 要求在从表设置外键关系。
  • 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求。
  • 主表的关联列必须是一个key(一般是主键或唯一)
  • 插入数据时,先插入主表再插入从表;删除数据时,先删除从表再删除主表。
列级约束和表级约束比较 位置 支持的约束类型 是否可以起别名
列级约束 列的后面 语法都支持,但外键没有效果 不可以
表级约束 所有列的下面 默认和非空不支持,其他支持 可以(主键没有效果)
【列级约束】
直接在字段名和类型后面追加约束类型。
注意:只支持默认、非空、主键、唯一,不支持外键约束CREATE DATABASE students;USE students;CREATE TABLE major(
	id INT PRIMARY KEY,# 主键
	majorName VARCHAR(20));CREATE TABLE 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) # 外键);DESC stuinfo;SHOW INDEX FROM stuinfo; # 查看表中所有的索引,外键,唯一【表级约束】# 语法:[CONSTRAINT 约束名 ] 约束类型(字段名)DROP TABLE IF EXISTS stuinfo;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;【修改表时添加约束】# 添加非空约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;# 添加默认约束ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;# 添加主键ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;# 添加唯一键ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;# 添加外键ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);DESC stuinfo;SHOW INDEX FROM stuinfo;【修改表时删除约束】# 删除非空约束ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;# 删除默认约束ALTER TABLE stuinfo MODIFY COLUMN age INT;# 删除主键ALTER TABLE stuinfo DROP PRIMARY KEY;# 删除唯一ALTER TABLE stuinfo DROP INDEX seat;# 删除外键ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
Copy after login

学习了约束,尝试完成籼米的测试题MySQL Lecture Three: DDL Data Definition Statement
1、列级约束:
ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY;# 列约束不支持起名字
表级约束:
ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);# 实际上主键起了名字也没效果
2、与1类似
3、
ALTER TABLE emp2 ADD COLUMN dept_id INT;
ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept2 FOREIGN KEY(dept_id) REFERENCES dept2(id);

四、标识列

标识列又称为自增长列,其实也可以将标识列纳入约束的范围。

含义:可以不用手动的插入值,系统提供默认的序列值。

特点:
1.标识列不一定非要和主键搭配,但要求是一个key。
2.一个表至多可以有一个表示列。
3.表示列的类型只能为数值型。
4.标识列可以通过SET auto_increment_increment=3;设置步长,也可以通过手动插入值来设置起始值。

【创建表时设置标识列】DROP TABLE IF EXISTS tab_identity;CREATE TABLE tab_identity(
	id INT PRIMARY KEY AUTO_INCREMENT, #设置自动自增
	NAME VARCHAR(20));INSERT INTO tab_identity VALUE(NULL,'花花');INSERT INTO tab_identity(NAME) VALUE('Hudie');SELECT * FROM tab_identity;SHOW VARIABLES LIKE '%auto_increment%';SET auto_increment_increment=3;#设置步长为3# 起始值可以通过改变第一条记录的值来更改TRUNCATE TABLE tab_identity;【修改表时设置标识列】CREATE TABLE tab_identity(
	id INT, #设置自动自增
	NAME VARCHAR(20));# 设置主键和标识列ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;修改表时删除标识列【】ALTER TABLE tab_identity MODIFY COLUMN id INT;
Copy after login

五、级联删除与置空

级联删除:
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
级联置空:
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;

【演示级联删除、级联置空】DROP TABLE major,stuinfoCREATE TABLE IF NOT EXISTS major(
	id INT PRIMARY KEY,
	majorName VARCHAR(20));INSERT INTO majorVALUES(1,'Java'),(2,'Python'),(3,'Go');CREATE TABLE IF NOT EXISTS stuinfo(
	id INT,
	stuname VARCHAR(20),
	gender CHAR(1),
	seat INT,
	age INT,
	majorid INT);INSERT INTO stuinfoSELECT 1,'join1','女',NULL,NULL,1 UNION ALLSELECT 2,'join2','女',NULL,NULL,1 UNION ALLSELECT 3,'join3','女',NULL,NULL,2 UNION ALLSELECT 4,'join4','女',NULL,NULL,2 UNION ALLSELECT 5,'join5','女',NULL,NULL,1 UNION ALLSELECT 6,'join6','女',NULL,NULL,3 UNION ALLSELECT 7,'join7','女',NULL,NULL,3 UNION ALLSELECT 8,'join8','女',NULL,NULL,1);SELECT * FROM major;SELECT * FROM stuinfo;# 传统方式添加外键ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id);# 删除major表的3号专业# 方式1:级联删除#   先删除外键ALTER TABLE stuinfo DROP FOREIGN KEY fk_stu_major;#   添加外键时添加级联删除ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;DELETE FROM major WHERE id =3;# 方式2:级联置空#   先删除外键ALTER TABLE stuinfo DROP FOREIGN KEY fk_stu_major;#   添加外键时添加级联置空ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;DELETE FROM major WHERE id =2;
Copy after login

更多相关免费学习推荐:mysql教程(视频)

The above is the detailed content of MySQL Lecture Three: DDL Data Definition Statement. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:csdn.net
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template