1、创建数据库
创建数据库语句:create database [IF NOT EXISTS] db_name [create_specification]
2、选项说明:
IF NOT EXISTS:如果要创建的数据库存在,创建时没有加此语句会报错。
create_specification:指明创建数据库的属性
Character set属性指明此数据库的默认字符集
Collate属性指明此数据库的默认排序规则
3、创建数据库
#创建名为test的数据库
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
#再次创建时会报错
mysql> create database test;
ERROR 1007 (HY000): Can't create database 'test'; database exists
#加” IF NOT EXISTS”后创建时不会报错,会有告警
mysql> create database if not exists test;
Query OK, 1 row affected, 1 warning (0.00 sec)
#切换到刚创建的数据库
mysql> use test;
Database changed
4、删除数据库
命令:drop database database_name;
Drop database语句用来删除数据库操作,既删除了数据库也删除了库里的所有表,同时也会删除该数据库所在文件夹下的相关文件。
创建完数据库后需要创建数据表,创建数据表的过程是规定数据列的属性的过程,同时也是实时数据完整性约束的过程。在创建表示需要先进入到创建的数据库中。
1、创建表的语法格式
(1)创建表语发一:
CREATE TABLE <表名>
(
字段名1,数据类型 [列级别约束条件] [默认值],
字段名2,数据类型 [列级别约束条件] [默认值],
……
[表级别约束条件]
);
(2)创建表的语法2:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] <表名>
(
[(create_definition,……)]
[table_options]
[partition_options]
[IGNORE | REPLACE]
[AS] query_expression
);
使用这种方法创建时各字段的说明如下:
IF NOT EXISTS:当此表名存在时,不执行创建语句,同时也不报错。
TEMPORARY:表示创建的表为临时表,临时表仅对本链接可见,另外的数据库链接不可见,当本链接断开时,临时表也自动被drop掉
IGNORE | REPLACE:Ignore和replace表示在插入数据的过程中如果新表中碰到违反唯一约束的情况下怎么处理,ignore表示不插入,replace表示替换已有的数据,默认两个关键词都不写则碰到违反的情况会报错
(3)创建表的语法3(创建表的同时将现有的表结构复制过来):
CREATE TABLE <表名>
(
LIKE 现有的表名
);
2、创建表
(1)创建普通表
# 在test库中创建一张学生表,有两个字段,sid为整数;sname为字符串,长度为12
mysql> create table student(sid int,sname varchar(12));
Query OK, 0 rows affected (0.65 sec)
# 查看刚创建的表结构
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| sname | varchar(12) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (3.11 sec)
#创建表时也可在不进入库时创建
mysql> create table test.student1(id int,name varchar(12));
Query OK, 0 rows affected (0.14 sec)
(2)创建临时表
# 在test库下创建临时表test123
mysql> create temporary table test.test1234(name varchar(12),age int(3));
Query OK, 0 rows affected (0.05 sec)
临时表只对当前的连接有效,当断开当前连接时,临时表会被drop掉,再次连接mysql时找不到临时表。
(3)依据已有的表的结构创建表
# 将mysql库中的user表结构复制到新建的testuser_copy表中
mysql> create table testuser_copy like mysql.user;
Query OK, 0 rows affected (0.03 sec)
# 在创建表testuser2_copy时将查询结果插入表中
mysql> create table testuser_copy2 as select user,host from mysql.user;
Query OK, 8 rows affected (0.22 sec)
Records: 8 Duplicates: 0 Warnings: 0
# 查询表testcopy2_user表中的数据
mysql> select * from testuser_copy2;
+---------------+---------------+
| user | host |
+---------------+---------------+
| root | 192.168.%.% |
| liuyi | 192.168.1.100 |
……
(4)创建表时设置属性
Data_type:设置字段的类型,如整型(int),字符创(varchar)
Not null/null:设置字段能否为空
Default:设置字段的默认值
auto_increment:表示字段为整数或者浮点数类型的value+1递增数值,value为当前表中该字段最大的值,默认是从1开始递增;一个表中只容许有一个自增字段,且该字段必须有key属性,不能含有default属性,且插入负值会被当成很大的正数
# 创建表student3,id不能为空
mysql> create table student3(id int not null,name varchar(10));
Query OK, 0 rows affected (0.43 sec)
# 创建表student4,age默认值为25
mysql> create table student4(id int not null,name varchar(12),age int default 25);
Query OK, 0 rows affected (1.65 sec)
# 创建带有auto_increment字段的表
mysql> create table student5(id int key auto_increment,name varchar(12));
Query OK, 0 rows affected (0.06 sec)
# 给表student5的name字段插入一条数据
mysql> insert into student5(name) values('dayi');
Query OK, 1 row affected (0.00 sec)
# id字段会自动插入
mysql> select * from student5;
+----+------+
| id | name |
+----+------+
| 1 | dayi |
+----+------+
1 row in set (0.00 sec)
(5)创建约束的数据表
Primary key:表示该字段为主键,主键字段必须唯一,必须非空,一个表中只能有一个主键,主键可以包含一个或多个字段
# 创建主键约束的数据表(也可使用create table teacher(id int,name varchar(12),primary key(id));格式创建)
mysql> create table teacher(id int primary key,name varchar(12));
Query OK, 0 rows affected (0.08 sec)
# 创建多个键联合主键约束表
mysql> create table teacher3(id int,name varchar(12),deptid int,primary key(id,deptid));
Query OK, 0 rows affected (0.01 sec)
外键用来在两个表的数据之间建立连接,外键可以是一列或者多列,一个表可以有一个或者多个外键,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值;定义外键后,不允许删除在另一个表中具有关联关系的行。
Key/index:表示索引字段
Unique:要求该列唯一,允许为空,但只能出现一个空值,唯一约束可以确保一列或者几列不出现重复值。
Foreign key:表示该字段为外键字段
Constraint:表示为主键、唯一键、外键等约束条件命名,如果没有命名则MySQL会默认给一个
Column_format:目前仅在ndb存储引擎的表上有用,表示该字段的存储类型是fixed, dynamic或者是default
Storage:目前也仅在ndb存储引擎的表上有用
# 先创建一个有主键约束的表gender
mysql> create table gender(gender_id int(11) not null,name varchar(12) default null, primary key(gender_id));
Query OK, 0 rows affected (0.01 sec)
# 创建表student6,让它的外键作为关联到表gender的gender_id
mysql> create table student6(id int primary key auto_increment,name varchar(12) unique,gender int,constraint gend_id foreign key(gender) references gender(gender_id));
Query OK, 0 rows affected (0.06 sec)
(6)查看创建的表
查看表结构:desc tablename
查看表结构详细语句:show create table tablename
# 查看表student6结构
mysql> desc student6;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(12) | YES | UNI | NULL | |
| gender | int(11) | YES | MUL | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
# 查看创建表student6的详细结构语句
mysql> show create table student6;
+----------+--------------------------------------------------------------------
| Table | Create Table
+----------+---------------------------------------------------------------------------
| student6 | CREATE TABLE `student6` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(12) DEFAULT NULL,
`gender` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `gend_id` (`gender`),
CONSTRAINT `gend_id` FOREIGN KEY (`gender`) REFERENCES `gender` (`gender_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+----------+----------------------------------------------------------------------------------
1 row in set (0.00 sec)
(7)创建表综合操作
创建一个名为course的数据库
在库中创建students表,包含的字段有sid(整型自增主键),sname(64字节字符串),gender(12位字符串),dept_id(整型并外键到dept表的id字段)。
在库中创建dept表,包含的字段有id(整型自增主键),dept_name(64位字符串)
在库中创建course表,包含的字段有id(整型自增主键),course_name(64位字符串),teacher_id(整型并外键到teacher表的id字段)
在库中创建teacher表,包含的主要字段为id(整型自增字段主键),name(字符串64位),dept_id(整型并外键到dept表的id字段)
# 创建并进入到库course
mysql> create database course;
mysql> use course;
#先创建dept表
mysql> create table dept(id int primary key auto_increment,dept_name varchar(64));
#创建student表
mysql> create table student(sid int primary key auto_increment,sname varchar(64),gender varchar(12),dept_id int not null,constraint deptid foreign key(dept_id) references dept(id));
# 创建teacher表
mysql> create table teacher(id int primary key auto_increment,name varchar(64),dept_id int not null,constraint dept_id foreign key(dept_id) references dept(id));
# 创建course表
mysql> create table course(id int primary key auto_increment,course_name varchar(64),teacher_id int,constraint teacher_id foreign key(teacher_id) references teacher(id));
(8)重命名表
表创建完成后,如果创建错了可以重命名表,Rename table能将表中的数据,索引,主键定义都自动转换到新表下,但视图和对原表分配的权限不能自动转换到新表,需要手动执行。
# 对表重命名
mysql> rename table student_backup to student02;
Query OK, 0 rows affected (0.01 sec)
(9)删除表
命令:drop table [IF EXISTS] 表1,表2……;
在删除表时可以同时删除多个表,如果删除被外键关联的父表时会报错;要删除被关联的父表时应该先删除与父表关联的字表,在删除父表。
# 删除表student
mysql> drop table student;
Query OK, 0 rows affected (0.12 sec)