赞
踩
简单语法
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 | 表示是/否的数据 | 存储布尔数据类型 |
注:默认情况下, 创建表不指定表的存储引擎, 则会使用配置文件my.cnf中 default-storage-engine=InnoDB指定的存储引擎。
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=行格式];
此部分内容,等待博主下次揭晓!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。