数据库系统原理与应用教程(023)—— MySQL 创建数据表的各种方法总结
MySQL 的数据表是最终保存数据的场所,在数据库中,所有的数据都保存在数据表中。创建数据表需要做三件事:
(1)定义数据表中所包含的列,包括:列名、数据类型、数据的完整性约束;
(2)定义数据表选项,包括:存储引擎,字符集;
(3)定义表分区选项。
可使用三种方式创建表:
一、使用 create table 命令创建数据表
create table 命令的语法如下:
create [temporary] table [if not exists] <表名>([列定义选项])
[表选项]
[分区选项];
[列定义选项]的格式为:
<列名1> <类型> <数据完整性约束>
[, <列名2> <类型> <数据完整性约束>
[, ...
[, <列名n> <类型n> <数据完整性约束>]]]
<数据完整性约束>的格式:
[NOT NULL | NULL]
[DEFAULT default_value]
[AUTO_INCREMENT]
[PRIMARY KEY]
[[unique] index|key index_name field_name(length)]
[foreign KEY(column_name) REFERENCES table_name(column_name))]
[COMMENT 'string']
[表选项]的格式为:
ENGINE = engine_name(存储引擎的名称)
AUTO_INCREMENT = value
[DEFAULT] CHARACTER SET charset_name(字符集名称)
[COLLATE collation_name(校对集名称)]
COMMENT = 'string'
例子:
1、定义主键
mysql> create table t1(
-> id int primary key,
-> name char(20)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> create table t2(
-> s_id int,
-> c_id int,
-> grade int,
-> primary key(s_id, c_id)
-> );
Query OK, 0 rows affected (0.02 sec)
2、定义外键
mysql> create table dept(
-> dept_id int primary key,
-> dept_name char(20)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> create table stu(
-> stu_id int primary key,
-> stu_name char(20),
-> dept_id int,
-> foreign key(dept_id) references dept(dept_id)
-> );
Query OK, 0 rows affected (0.07 sec)
3、非空约束
mysql> create table t21(
-> id int primary key,
-> name char(20) not null,
-> gender char(1),
-> birth datetime not null,
-> phone char(20) not null
-> );
Query OK, 0 rows affected (1.82 sec)
4、自增列
mysql> insert into t22(name,gender,birth,phone) values('张云','女','1988-1-22','13503732544');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t22;
+
| id | name | gender | birth | phone |
+
| 1 | 张云 | 女 | 1988-01-22 00:00:00 | 13503732544 |
+
1 row in set (0.00 sec)
mysql> create table t23(
-> id int auto_increment primary key,
-> name char(20) not null,
-> gender char(1),
-> birth datetime not null,
-> phone char(20) not null
-> )
-> auto_increment = 1001;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t23(name,gender,birth,phone) values('张云','女','1988-1-22','13503732544');
Query OK, 1 row affected (0.02 sec)
mysql> select * from t23;
+
| id | name | gender | birth | phone |
+
| 1001 | 张云 | 女 | 1988-01-22 00:00:00 | 13503732544 |
+
1 row in set (0.00 sec)
5、索引
mysql> create table t24(
-> id int auto_increment primary key,
-> name char(20) not null,
-> gender char(1),
-> birth datetime not null,
-> phone char(20) not null,
-> dept_name char(20),
-> addr varchar(200),
-> index (name),
-> unique index(phone),
-> key idx_dept_birth(dept_name,birth),
-> key idx_addr(addr(12))
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> desc t24;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | MUL | NULL | |
| gender | char(1) | YES | | NULL | |
| birth | datetime | NO | | NULL | |
| phone | char(20) | NO | UNI | NULL | |
| dept_name | char(20) | YES | MUL | NULL | |
| addr | varchar(200) | YES | MUL | NULL | |
+
7 rows in set (0.06 sec)
mysql> show create table t24\G
*************************** 1. row ***************************
Table: t24
Create Table: CREATE TABLE `t24` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
`gender` char(1) DEFAULT NULL,
`birth` datetime NOT NULL,
`phone` char(20) NOT NULL,
`dept_name` char(20) DEFAULT NULL,
`addr` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `phone` (`phone`),
KEY `name` (`name`),
KEY `idx_dept_birth` (`dept_name`,`birth`),
KEY `idx_addr` (`addr`(12))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
6、默认值
mysql> create table t25(
-> id int primary key auto_increment,
-> name char(20),
-> gender char(1) default '男',
-> createtime datetime default now(),
-> phone char(20),
-> addr varchar(200)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc t25;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | YES | | NULL | |
| gender | char(1) | YES | | 男 | |
| createtime | datetime | YES | | CURRENT_TIMESTAMP | |
| phone | char(20) | YES | | NULL | |
| addr | varchar(200) | YES | | NULL | |
+
6 rows in set (0.01 sec)
mysql> insert into t25(name,phone,addr) values('张平','13637351245','河南省新乡市');
Query OK, 1 row affected (0.36 sec)
mysql> select * from t25;
+
| id | name | gender | createtime | phone | addr |
+
| 1 | 张平 | 男 | 2022-07-16 15:06:23 | 13637351245 | 河南省新乡市 |
+
1 row in set (0.00 sec)
7、字段注释
mysql> show create table t26\G
*************************** 1. row ***************************
Table: t26
Create Table: CREATE TABLE `t26` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` char(20) DEFAULT NULL COMMENT '姓名',
`gender` char(1) DEFAULT '男' COMMENT '性别',
`createtime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '插入日期',
`phone` char(20) DEFAULT NULL COMMENT '电话',
`addr` varchar(200) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
8、添加表注释
mysql> create table t31(
-> id int primary key,
-> name char(20)
-> )
-> comment '测试表';
Query OK, 0 rows affected (1.83 sec)
mysql> show create table t31\G
*************************** 1. row ***************************
Table: t31
Create Table: CREATE TABLE `t31` (
`id` int(11) NOT NULL,
`name` char(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表'
1 row in set (0.00 sec)
9、设置表的存储引擎(默认为 innodb)
mysql> create table t41(id int);
Query OK, 0 rows affected (1.50 sec)
mysql> show create table t41\G
*************************** 1. row ***************************
Table: t41
Create Table: CREATE TABLE `t41` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> create table t42(id int) engine=myisam;
Query OK, 0 rows affected (0.04 sec)
mysql> show create table t42\G
*************************** 1. row ***************************
Table: t42
Create Table: CREATE TABLE `t42` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.05 sec)
10、设置表所用的字符集(默认和数据库相同)
mysql> create table t51(id int);
Query OK, 0 rows affected (0.03 sec)
mysql> show create table t51\G
*************************** 1. row ***************************
Table: t51
Create Table: CREATE TABLE `t51` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> create table t52(id int) default charset=latin1;
Query OK, 0 rows affected (0.02 sec)
mysql> show create table t52\G
*************************** 1. row ***************************
Table: t52
Create Table: CREATE TABLE `t52` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
二、在原有表的基础上定义新表
使用 create table like 命令可以利用一个已经存在的表创建一个新表。语法如下:
create [temporary] table [if not exists] table_name
like old_tbale_name;
例如:
mysql> create table t61(
-> id int auto_increment primary key,
-> name char(20) not null,
-> gender char(1),
-> birth datetime not null,
-> phone char(20) not null,
-> dept_name char(20),
-> addr varchar(200),
-> index (name),
-> unique index(phone),
-> key idx_dept_birth(dept_name,birth),
-> key idx_addr(addr(12))
-> );
Query OK, 0 rows affected (1.51 sec)
mysql> insert into t61(name,gender,birth,phone,dept_name,addr)
-> values('张华','男','1998-10-8','13937325888','销售部','河南省新乡市');
Query OK, 1 row affected (0.22 sec)
mysql> show create table t61\G
*************************** 1. row ***************************
Table: t61
Create Table: CREATE TABLE `t61` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
`gender` char(1) DEFAULT NULL,
`birth` datetime NOT NULL,
`phone` char(20) NOT NULL,
`dept_name` char(20) DEFAULT NULL,
`addr` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `phone` (`phone`),
KEY `name` (`name`),
KEY `idx_dept_birth` (`dept_name`,`birth`),
KEY `idx_addr` (`addr`(12))
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> select * from t61;
+
| id | name | gender | birth | phone | dept_name | addr |
+
| 1 | 张华 | 男 | 1998-10-08 00:00:00 | 13937325888 | 销售部 | 河南省新乡市 |
+
1 row in set (0.00 sec)
mysql> create table t62 like t61;
Query OK, 0 rows affected (0.08 sec)
mysql> show create table t62\G
*************************** 1. row ***************************
Table: t62
Create Table: CREATE TABLE `t62` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
`gender` char(1) DEFAULT NULL,
`birth` datetime NOT NULL,
`phone` char(20) NOT NULL,
`dept_name` char(20) DEFAULT NULL,
`addr` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `phone` (`phone`),
KEY `name` (`name`),
KEY `idx_dept_birth` (`dept_name`,`birth`),
KEY `idx_addr` (`addr`(12))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
mysql> select * from t62;
Empty set (0.00 sec)
三、使用 select 查询的结果创建表
可以利用一个 select 查询的结果创建一张新表。语法如下:
create [temporary] table [if not exists] table_name
[(create_definition,...)]
[table_options]
[partition_options]
[ignore | replace]
[as] query_expression
例如:
1、使用查询结果创建一张新表,表结构和查询相同
mysql> create table emp(
-> e_id int primary key,
-> e_name char(20) not null,
-> gender enum('男','女'),
-> phone char(20) not null,
-> salary int,
-> addr varchar(200)
-> );
Query OK, 0 rows affected (0.04 sec)
insert into emp values(1001,'张静静','女','13737325699',5200,'河南省新乡市');
insert into emp values(1002,'张学有','男','13737327788',8500,'河南省新乡市');
insert into emp values(1003,'刘得华','男','13737326688',6400,'河南省开封市');
insert into emp values(1004,'麻花藤','男','13737329988',9200,'河南省商丘市');
insert into emp values(1005,'刘晓庆','女','13737328877',6800,'河南省开封市');
insert into emp values(1006,'码云','男','13737326688',4900,'河南省新乡市');
insert into emp values(1007,'张朝阳','男','13737324567',8600,'河南省郑州市');
insert into emp values(1008,'巩利利','女','13737328888',6300,'河南省新乡市');
insert into emp values(1009,'张云','女','13637326666',7400,'河南省郑州市');
mysql> select * from emp;
+
| e_id | e_name | gender | phone | salary | addr |
+
| 1001 | 张静静 | 女 | 13737325699 | 5200 | 河南省新乡市 |
| 1002 | 张学有 | 男 | 13737327788 | 8500 | 河南省新乡市 |
| 1003 | 刘得华 | 男 | 13737326688 | 6400 | 河南省开封市 |
| 1004 | 麻花藤 | 男 | 13737329988 | 9200 | 河南省商丘市 |
| 1005 | 刘晓庆 | 女 | 13737328877 | 6800 | 河南省开封市 |
| 1006 | 码云 | 男 | 13737326688 | 4900 | 河南省新乡市 |
| 1007 | 张朝阳 | 男 | 13737324567 | 8600 | 河南省郑州市 |
| 1008 | 巩利利 | 女 | 13737328888 | 6300 | 河南省新乡市 |
| 1009 | 张云 | 女 | 13637326666 | 7400 | 河南省郑州市 |
+
9 rows in set (0.02 sec)
mysql> create table t81 as select * from emp where addr='河南省新乡市';
Query OK, 4 rows affected (0.13 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> show create table t81\G
*************************** 1. row ***************************
Table: t81
Create Table: CREATE TABLE `t81` (
`e_id` int(11) NOT NULL,
`e_name` char(20) NOT NULL,
`gender` enum('男','女') DEFAULT NULL,
`phone` char(20) NOT NULL,
`salary` int(11) DEFAULT NULL,
`addr` varchar(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> select * from t81;
+
| e_id | e_name | gender | phone | salary | addr |
+
| 1001 | 张静静 | 女 | 13737325699 | 5200 | 河南省新乡市 |
| 1002 | 张学有 | 男 | 13737327788 | 8500 | 河南省新乡市 |
| 1006 | 码云 | 男 | 13737326688 | 4900 | 河南省新乡市 |
| 1008 | 巩利利 | 女 | 13737328888 | 6300 | 河南省新乡市 |
+
4 rows in set (0.00 sec)
2、使用查询结果创建一张新表,并且重新定义表结构
mysql> create table t82(
-> e_id int primary key,
-> e_name char(20),
-> addr char(100)
-> ) engine = myisam
-> as
-> select e_id,e_name,addr
-> from emp
-> where gender='女';
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> show create table t82\G
*************************** 1. row ***************************
Table: t82
Create Table: CREATE TABLE `t82` (
`e_id` int(11) NOT NULL,
`e_name` char(20) DEFAULT NULL,
`addr` char(100) DEFAULT NULL,
PRIMARY KEY (`e_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> select * from t82;
+
| e_id | e_name | addr |
+
| 1001 | 张静静 | 河南省新乡市 |
| 1005 | 刘晓庆 | 河南省开封市 |
| 1008 | 巩利利 | 河南省新乡市 |
| 1009 | 张云 | 河南省郑州市 |
+
4 rows in set (0.00 sec)
四、MySQL 常用的操作表的命令
1、查看当前数据库中的数据表
语法格式如下:
show tables;
例如:
mysql> show tables;
+
| Tables_in_mydb |
+
| dept |
| emp |
| stu |
| t1 |
| t2 |
| t21 |
| t22 |
| t23 |
| t24 |
| t25 |
| t26 |
| t31 |
| t41 |
| t42 |
| t51 |
| t52 |
| t61 |
| t62 |
| t81 |
| t82 |
+
20 rows in set (0.02 sec)
2、删除数据表
语法格式如下:
drop table 表名;
例如:
mysql> drop table t1;
Query OK, 0 rows affected (0.01 sec)
mysql> drop table t2;
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+
| Tables_in_mydb |
+
| dept |
| emp |
| stu |
| t21 |
| t22 |
| t23 |
| t24 |
| t25 |
| t26 |
| t31 |
| t41 |
| t42 |
| t51 |
| t52 |
| t61 |
| t62 |
| t81 |
| t82 |
+
18 rows in set (0.00 sec)
3、查看表结构
语法格式如下:
describe | desc 表名;
例如:
mysql> desc emp;
+
| Field | Type | Null | Key | Default | Extra |
+
| e_id | int(11) | NO | PRI | NULL | |
| e_name | char(20) | NO | | NULL | |
| gender | enum('男','女') | YES | | NULL | |
| phone | char(20) | NO | | NULL | |
| salary | int(11) | YES | | NULL | |
| addr | varchar(200) | YES | | NULL | |
+
6 rows in set (0.01 sec)
mysql> describe emp;
+
| Field | Type | Null | Key | Default | Extra |
+
| e_id | int(11) | NO | PRI | NULL | |
| e_name | char(20) | NO | | NULL | |
| gender | enum('男','女') | YES | | NULL | |
| phone | char(20) | NO | | NULL | |
| salary | int(11) | YES | | NULL | |
| addr | varchar(200) | YES | | NULL | |
+
6 rows in set (0.00 sec)
4、查看创建表的语句
语法格式如下:
show create table 表名;
show create table 表名\G
例如:
mysql> show create table emp;
+
|+
`e_id` int(11) NOT NULL,
`e_name` char(20) NOT NULL,
`gender` enum('男','女') DEFAULT NULL,
`phone` char(20) NOT NULL,
`salary` int(11) DEFAULT NULL,
`addr` varchar(200) DEFAULT NULL,
PRIMARY KEY (`e_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+
1 row in set (0.00 sec)
mysql> show create table emp\G
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE `emp` (
`e_id` int(11) NOT NULL,
`e_name` char(20) NOT NULL,
`gender` enum('男','女') DEFAULT NULL,
`phone` char(20) NOT NULL,
`salary` int(11) DEFAULT NULL,
`addr` varchar(200) DEFAULT NULL,
PRIMARY KEY (`e_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
|