简单语法
create table 表名(
列名 列数据类型,
列名 列数据类型
);
mysql> create table stu(
-> name char(10),
-> age int(3)
-> );
Query OK, 0 rows affected, 1 warning (0.08 sec)
mysql> show tables; #显示当前数据库中所有的表
+-----------------+
| Tables_in_huazi |
+-----------------+
| stu |
+-----------------+
1 row in set (0.00 sec)
在MySQL中,有三种主要的类型:文本,数值,日期/时间类型
数据类型 | 作用 |
---|---|
char(size) | 保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。 |
varchar(size) | 保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。 注释:如果值的长度大于 255,则被转换为 text 类型。 |
tinytext | 存放最大长度为255个字符的字符串。 |
text | 存放最大长度为 65535 个字符的字符串。 |
blob | 用于 BLOBs (Binary Large OBjects),二进制形式的长文本数据。存放最多 65535 字节的数据。 |
mediumtext | 存放最大长度为 16,777,215 个字符的字符串。 |
mediumblob | 用于 BLOBs (Binary Large OBjects),二进制形式的中等长度文本数据。存放最多 16,777,215 字节的数据。 |
longtext | 存放最大长度为 4,294,967,295 个字符的字符串。 |
longblob | 用于 BLOBs (Binary Large OBjects),二进制形式的极大文本数据。 存放最多 4,294,967,295 字节的数据。 |
enum(x,y,z,etc.) | 允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 注释:这些值是按照你输入的顺序存储的。 可以按照此格式输入可能的值: enum(‘X’,‘Y’,‘Z’) |
set | 与enum类似, set最多只能包含 64 个列表项,不过set可存储一个以上的值。 |
类型 | 用途 | 存储需求 | 范围(有符号) | 范围(无符号) |
---|---|---|---|---|
tinyint | 小整数值 | 1Bytes | (-128,127) | (0,255) |
smallint | 大整数值 | 2Bytes | (-32768,32767) | (0,65535) |
mediumint | 大整数值 | 3Bytes | (-8388608,8388607) | (0,16777215) |
int或integer | 大整数值 | 4Bytes | (-2147483648,2147483647) | (0,4294967295) |
bigint | 极大整数值 | 8Bytes | (-9223372036854775808,9223372036854775807) | (0,18446744073709551615) |
float(size,d) | 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 | 4Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) |
double(size,d) | 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 | 8Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
decimal(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。 | (size+2)Byte |
注:这些数值类型拥有额外的选项 unsigned。通常,整数可以是负数或正数。如果添加 unsigned属性,那么范围将从 0 开始,而不是某个负数。
数据类型 | 存储需求 | 描述 |
---|---|---|
date | 3Bytes | 日期。格式: YYYY-MM-DD 注释:支持的范围是从 ‘1000-01-01’ 到 ‘9999-12-31’ |
datetime | 8Bytes | 日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS 注释:支持的范围是’1000-01-01 00:00:00’ 到 ‘9999-12- 31 23:59:59’ |
timestamp | 4Bytes | 时间戳。 timestamp值使用 Unix 纪元(‘1970-01-01 00:00:00’ UTC) 至今的描述来存储。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是从 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC |
time | 3Bytes | 时间。格式: HH:MM:SS 注释:支持的范围是从 ‘-838:59:59’ 到 ‘838:59:59’ |
year | 1Bytes | 2 位或 4 位格式的年。 注释: 4 位格式所允许的值: 1901 到 2155。 2 位格式所允许的值: 70 到69,表示从 1970 到 2069 |
数据类型 | 说明 | 用途 |
---|---|---|
bit | 表示是/否的数据 | 存储布尔数据类型 |
mysql> create table stu(
-> name varchar(10) comment '姓名',
-> age tinyint(3) comment '年龄',
-> gender enum('男','女')
-> )engine=innodb default charset=gbk row_format=dynamic;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`name` varchar(10) DEFAULT NULL COMMENT '姓名',
`age` tinyint DEFAULT NULL COMMENT '年龄',
`gender` enum('男','女') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
mysql> drop table stu; # 删除表
Query OK, 0 rows affected (0.03 sec)
mysql> create table stu(
-> name varchar(10) comment '姓名',
-> age tinyint(3) comment '年龄',
-> gender enum('男','女')
-> )engine=innodb default charset=gbk collate=gbk_chinese_ci row_format=dynamic;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`name` varchar(10) DEFAULT NULL COMMENT '姓名',
`age` tinyint DEFAULT NULL COMMENT '年龄',
`gender` enum('男','女') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
mysql> create table teacher(
-> name varchar(10) comment '姓名',
-> age tinyint(3) comment '年龄',
-> gender enum('男','女')
-> )engine=innodb charset=gbk collate=gbk_chinese_ci row_format=dynamic;
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> show create table teacher;
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| teacher | CREATE TABLE `teacher` (
`name` varchar(10) DEFAULT NULL COMMENT '姓名',
`age` tinyint DEFAULT NULL COMMENT '年龄',
`gender` enum('男','女') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> create table worker(
-> name varchar(10) comment '姓名',
-> age tinyint(3) comment '年龄',
-> gender enum('男','女')
-> )engine=innodb;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> show create table worker;
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| worker | CREATE TABLE `worker` (
`name` varchar(10) DEFAULT NULL COMMENT '姓名',
`age` tinyint DEFAULT NULL COMMENT '年龄',
`gender` enum('男','女') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> create table body(
-> name varchar(10) comment '姓名',
-> age tinyint(3) comment '年龄',
-> gender enum('男','女')
-> )engine=innodb default; # 会报错
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
mysql> create table body(
-> name varchar(10) comment '姓名',
-> age tinyint(3) comment '年龄',
-> gender enum('男','女')
-> )engine=innodb;
Query OK, 0 rows affected, 1 warning (0.02 sec)
总结:在定义表时,写不写default都不影响。
在定义表名和列名时,本质是使用反引号包裹
语法:
mysql> show tables [from 数据库名] [like wild];
mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| stu |
+-----------------+
1 row in set (0.00 sec)
mysql> show tables from huazi like "%u";
+----------------------+
| Tables_in_huazi (%u) |
+----------------------+
| stu |
+----------------------+
1 row in set (0.00 sec)
语法:
mysql> desc 表名 [列名];
或
mysql> describe 表名 [列名];
或
mysql> show columns from 表名;
mysql> desc stu;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> desc stu name;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> show columns from stu;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
语法:
mysql> show create table 表名\G;
(\G表示向mysql服务器发送命令,垂直显示结果)
mysql> show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`name` char(10) DEFAULT NULL,
`age` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
ERROR:
No query specified
定义表中的列名和表名,本质上是使用反引号包裹
语法
mysql> drop table [if exists] 表名;
mysql> create table stu(
-> `姓名` varchar(10),
-> `年龄` int(3),
-> `学号` int
-> )engine=innodb default charset=utf8 row_format=dynamic;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`姓名` varchar(10) DEFAULT NULL,
`年龄` int DEFAULT NULL,
`学号` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
mysql> drop table if exists stu;
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
Empty set (0.00 sec)
语法
mysql> alter table 表名 rename 新表名;
或
mysql> rename table 表名 to 新表名;
语法
mysql> alter table 表名 change 原列名 新列名 数据类型;
语法
mysql> alter table 表名 modify 列表 数据类型;
或
mysql> alter table 表名 modify 列表 数据类型 约束类型; #修改数据类型时添加约束
语法
mysql> alter table 表名 drop 列名;
语法
mysql> alter table 表名 add 列名 数据类型;
mysql> alter table 表名 add 列名 数据类型 after 列名; (在指定列名之后添加字段)
mysql> alter table worker add 性别 char(1) not null; (添加列时加约束)
mysql> create table stu(
-> name char(10) comment '姓名',
-> age int(3) comment '年龄'
-> )engine=innodb default charset=gbk row_format=dynamic;
mysql> alter table stu rename stu_info; # 修改表名
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| stu_info |
+-----------------+
1 row in set (0.03 sec)
mysql> alter table stu_info change `name` `姓名` char(10); # 修改列名
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc stu_info;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| 姓名 | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table stu_info modify `age` tinyint(3); # 修改数据类型
Query OK, 0 rows affected, 1 warning (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> desc stu_info;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| 姓名 | char(10) | YES | | NULL | |
| age | tinyint | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table stu_info drop `age`; # 删除列
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc stu_info;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| 姓名 | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> alter table stu_info add `id` int after `姓名`; # 添加列
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc stu_info;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| 姓名 | char(10) | YES | | NULL | |
| id | int | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
在create table语法的末尾添加like子句,可以将原表的表结构复制到新表中。
语法:
mysql> create table 新表名 like 原表名;
mysql> show create table stu_info\G;
*************************** 1. row ***************************
Table: stu_info
Create Table: CREATE TABLE `stu_info` (
`姓名` char(10) DEFAULT NULL,
`id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
mysql> create table stu like stu_info; # 复制表结构
Query OK, 0 rows affected (0.02 sec)
mysql> show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`姓名` char(10) DEFAULT NULL,
`id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
mysql> desc stu_info;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| 姓名 | char(10) | YES | | NULL | |
| id | int | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> desc stu;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| 姓名 | char(10) | YES | | NULL | |
| id | int | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
在create table语句的末尾添加一个select语法,不仅可以实现表结构的复制,还可以将原表中的数据拷贝到新表中。
语法:
mysql> create table 新表名 select * from 原表名;
方法:如果已经存在一张结构一致的表,复制数据
语法:
mysql> insert into 表名 select * from 原表名;
由information_schema数据库负责维护:
tables-存放数据库里所有的数据表、以及每个表所在数据库。
schemata-存放数据库里所有的数据库信息
views-存放数据库里所有的视图信息。
columns-存放数据库里所有的列信息。
triggers-存放数据库里所有的触发器。
routines-存放数据库里所有存储过程和函数。
key_column_usage-存放数据库所有的主外键
table_constraints-存放各个表的约束。
statistics-存放了数据表的索引。
mysql> [constraint 约束名] 约束类型
约束名的取名规则:表名_列名_约束类型 (推荐)
mysql> alter table 表名 add constraint 约束名 约束类型;
只能作用在一个列上,跟在列的定义后面,语法:列定义 约束类型
mysql> create table stu(
-> id int primary key auto_increment comment '学号',
-> name varchar(20) not null comment '姓名',
-> age tinyint(3) check(age>=18) comment '年龄不小于18',
-> gender char(1) default 'M' check(gender in ('M','F')) comment '性别',
-> address varchar(50) unique
-> )auto_increment=1001;
Query OK, 0 rows affected, 1 warning (0.06 sec)
mysql> show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(20) NOT NULL COMMENT '姓名',
`age` tinyint DEFAULT NULL COMMENT '年龄不小于18',
`gender` char(1) DEFAULT 'M' COMMENT '性别',
`address` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `address` (`address`),
CONSTRAINT `stu_chk_1` CHECK ((`age` >= 18)),
CONSTRAINT `stu_chk_2` CHECK ((`gender` in (_gbk'M',_gbk'F')))
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.03 sec)
mysql> desc stu;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| age | tinyint | YES | | NULL | |
| gender | char(1) | YES | | M | |
| address | varchar(50) | YES | UNI | NULL | |
+---------+-------------+------+-----+---------+----------------+
总结:
可以作用在多个列上,不与列一起,而是单独定义
mysql> create table class(
-> class_id int primary key comment '班号'
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> create table stu(
-> id int auto_increment comment '学号',
-> name varchar(20) not null comment '姓名',
-> age tinyint(3) not null comment '年龄不小于18',
-> gender char(1) default 'M' not null comment '性别',
-> address varchar(50) not null comment '住址',
-> classid int not null comment '班号',
-> constraint stu_id_primary primary key(id), # 主键约束
-> constraint stu_age_check check(age>=18), # 检查约束
-> constraint stu_gender_check check(gender in ('M','F')), # 检查约束
-> constraint stu_address_unique unique(address), # 唯一约束
-> constraint stu_class_foreign foreign key(classid) references class(class_id) # 外键约束
-> )auto_increment=1001;
Query OK, 0 rows affected, 1 warning (0.06 sec)
mysql> show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(20) NOT NULL COMMENT '姓名',
`age` tinyint NOT NULL COMMENT '年龄不小于18',
`gender` char(1) NOT NULL DEFAULT 'M' COMMENT '性别',
`address` varchar(50) NOT NULL COMMENT '住址',
`classid` int NOT NULL COMMENT '班号',
PRIMARY KEY (`id`),
UNIQUE KEY `stu_address_unique` (`address`),
KEY `stu_class_foreign` (`classid`),
CONSTRAINT `stu_class_foreign` FOREIGN KEY (`classid`) REFERENCES `class` (`class_id`),
CONSTRAINT `stu_age_check` CHECK ((`age` >= 18)),
CONSTRAINT `stu_gender_check` CHECK ((`gender` in (_gbk'M',_gbk'F')))
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
总结
注:
1.列级约束和表级约束可以联合写(最推荐的写法)
2.当使用列级约束进行check约束时,系统会自动起一个check约束名
3.一个表中primary key和auto_increment只能有一个
mysql> create table class(
-> class_id int primary key comment '班号'
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> create table stu(
-> id int comment '学号',
-> name varchar(30),
-> age tinyint(3),
-> gender char(1),
-> address varchar(50),
-> classid int
-> );
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> alter table stu add constraint stu_id_primary primary key(id);
mysql> alter table stu add constraint stu_age_check check(age>=18);
mysql> alter table stu add constraint stu_gender_check check(gender in ('M','F'));
mysql> alter table stu add constraint stu_address_unique unique(address);
mysql> alter table stu add constraint stu_classid_foreign foreign key(classid) references class(class_id);
mysql> alter table stu modify name varchar(30) not null;
mysql> alter table stu modify gender char(1) default 'M';
mysql> alter table stu modify id tinyint not null auto_increment;
mysql> show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`id` tinyint NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`age` tinyint DEFAULT NULL,
`gender` char(1) DEFAULT 'M',
`address` varchar(50) DEFAULT NULL,
`classid` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `stu_address_unique` (`address`),
KEY `stu_classid_foreign` (`classid`),
CONSTRAINT `stu_classid_foreign` FOREIGN KEY (`classid`) REFERENCES `class` (`class_id`),
CONSTRAINT `stu_age_check` CHECK ((`age` >= 18)),
CONSTRAINT `stu_gender_check` CHECK ((`gender` in (_utf8mb4'M',_utf8mb4'F')))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
总结
总结
总结:只要有唯一性的存在,MySQL都会为之建立对应的索引。
mysql> alter table stu drop foreign key 外键约束的约束名;(删除外键约束)
mysql> alter table stu drop primary key [主键约束的约束名];(删除主键约束)
mysql> alter table stu drop index 唯一约束的约束名;(删除唯一约束)
mysql> alter table stu drop check 检查约束的约束名;(删除检查约束)
mysql> alter table stu modify id tinyint;(删除default和not null和auto_increment)
总结
create table 表名 (
列名 列类型 [primary key AUTO_INCREMENT] [默认值] [列级约束]
...
[表级约束]
) [ENGINE=存储引擎类型] [auto_increment=初始值] [DEFAULT] [CHARSET=字符集] [collate=校对规则] [row_format=行格式];