Mysql数据库(三)Mysql表结构管理

  一、MySQL数据类型

  1.数字类型

  (1)整数数据类型包括TINYINT/BIT/BOOL/SMALLINT/MEDIUMINT/INT/BIGINT

  (2)浮点数据类型包括FLOAT/DOUBLE/DECIMAL

  原则: 1.选择最小的可用类型,如果值永远不超过127,则使用TINYINT比INT强。

      2.对于完全都是数字的,可以选择整数类型。

        3.浮点类型用于可能具有小数部分的数。如货物单价、网上购物交付金额等。

  2.字符串类型

  (1)普通的文本字符串类型包括CHAR(取值为1~255)和VARCHAR(变长的字符串)

  (2)TEXT和BLOB类型。它们的大小可以改变,TEXT类型适合存储长文本,而BLOB类型适合存储二进制数据,支持任何数据,例如文本、声音和图像等。

  (3)特殊类型SET和ENUM。

  原则:   1.从速度方面考虑,要选择固定的列,可以使用CHAR类型。

      2.要节省空间,使用动态地列,可以使用VARCHAR类型。

      3.要将列中的内容仙之子一种选择,可以使用ENUM类型。

      4.允许在一个列中有多于一个的条目,可以使用SET类型。

      5.如果要搜索的内容不区分大小写,可以使用TEXT类型。

      6.如果要搜索的内容区分大小写,可以使用BLOB类型。

  3.日期和时间数据类型

  (1)DATE:YYYY-MM-DD

  (2)TIME:HH:MM:SS

  (3)DATETIME:YYYY-MM-DD HH:MM:SS

  (4)TIMESTAMP:时间标签,在处理报告时使用的显示格式取决于M的值。

  (5)YEAR:年份可指定两位数字和四位数字的格式。

  二、创建表

mysql> use db_library;
Database changed
mysql> CREATE TABLE tb_bookinfo(
    -> barcode varchar(30),
    -> bookname varchar(70),
    -> typeid int(10) unsigned,
    -> author varchar(30),
    -> ISBN varchar(20),
    -> price float(8,2),
    -> page int(10) unsigned,
    -> bookcase int(10) unsigned,
    -> inTime date,
    -> del tinyint(1) DEFAULT'0',
    -> id int(11) NOT NULL
    -> );
Query OK, 0 rows affected (0.03 sec)

   1.设置默认的存储引擎

mysql> CREATE TABLE tb_booktype(
    -> id int(10) unsigned NOT NULL,
    -> typename varchar(30),
    -> days int(10) unsigned
    -> )ENGINE=MyISAM;
Query OK, 0 rows affected (0.01 sec)

   2.设置自增类型字段的同时,最好将其设置为主键(注意反引号和单引号的区别,反引号是Esc下面那个)

mysql> CREATE TABLE tb_booktype1(
    -> id int(10) unsigned NOT NULL AUTO_INCREMENT,
    -> typename varchar(30),
    -> days int(10) unsigned,
    -> PRIMARY KEY (`id`)
    -> );
Query OK, 0 rows affected (0.03 sec)

   3.设置字符集

mysql> CREATE TABLE tb_booktype2(
    -> id int(10) unsigned NOT NULL AUTO_INCREMENT,
    -> typename varchar(30),
    -> days int(10) unsigned,
    -> PRIMARY KEY (`id`)
    -> )DEFAULT CHARSET=GBK;
Query OK, 0 rows affected (0.02 sec)

   4.复制表结构,实现在数据库db_library中创建一份数据表tb_bookinfo的副本tb_bookinfobak。

  (1)向数据表tb_bookinfo中插入一条数据

mysql> INSERT INTO tb_bookinfo VALUES ('17120107','Java King','3','LianJiang','115',49.80,350,1,'2018-04-17',0,1);
Query OK, 1 row affected (0.00 sec)

   (2)创建一份数据表tb_bookinfo的副本tb_bookinfobak

mysql> CREATE TABLE tb_bookinfobak LIKE tb_bookinfo;
Query OK, 0 rows affected (0.02 sec)

   (3)查看两个表的结构

mysql> DESC tb_bookinfo;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| barcode  | varchar(30)      | YES  |     | NULL    |       |
| bookname | varchar(70)      | YES  |     | NULL    |       |
| typeid   | int(10) unsigned | YES  |     | NULL    |       |
| author   | varchar(30)      | YES  |     | NULL    |       |
| ISBN     | varchar(20)      | YES  |     | NULL    |       |
| price    | float(8,2)       | YES  |     | NULL    |       |
| page     | int(10) unsigned | YES  |     | NULL    |       |
| bookcase | int(10) unsigned | YES  |     | NULL    |       |
| inTime   | date             | YES  |     | NULL    |       |
| del      | tinyint(1)       | YES  |     | 0       |       |
| id       | int(11)          | NO   |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

mysql> DESC tb_bookinfobak;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| barcode  | varchar(30)      | YES  |     | NULL    |       |
| bookname | varchar(70)      | YES  |     | NULL    |       |
| typeid   | int(10) unsigned | YES  |     | NULL    |       |
| author   | varchar(30)      | YES  |     | NULL    |       |
| ISBN     | varchar(20)      | YES  |     | NULL    |       |
| price    | float(8,2)       | YES  |     | NULL    |       |
| page     | int(10) unsigned | YES  |     | NULL    |       |
| bookcase | int(10) unsigned | YES  |     | NULL    |       |
| inTime   | date             | YES  |     | NULL    |       |
| del      | tinyint(1)       | YES  |     | 0       |       |
| id       | int(11)          | NO   |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

   (4)分别查看两个表的内容,发现复制的表中没有复制表中的数据

mysql> SELECT * FROM tb_bookinfobak;
Empty set (0.00 sec)

mysql> SELECT * FROM tb_bookinfo;
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
| barcode  | bookname  | typeid | author    | ISBN | price | page | bookcase | inTime     | del  | id |
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
| 17120107 | Java King |      3 | LianJiang | 115  | 49.80 |  350 |        1 | 2018-04-17 |    0 |  1 |
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
1 row in set (0.00 sec)

   (5)如果在复制数据表时,想要同时复制其中的数据的话,需要这样实现。但是,新复制出来的数据表并不包括原表中设置的主键、自动编号等内容。

mysql> CREATE TABLE tb_bookinfobak1 AS SELECT * FROM tb_bookinfo;
Query OK, 1 row affected (0.14 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tb_bookinfobak1;
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
| barcode  | bookname  | typeid | author    | ISBN | price | page | bookcase | inTime     | del  | id |
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
| 17120107 | Java King |      3 | LianJiang | 115  | 49.80 |  350 |        1 | 2018-04-17 |    0 |  1 |
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
1 row in set (0.00 sec)

   (6)如果要复制一下表结构和数据都完全一样的数据表,那么需要应用下面两句语句实现。

 

mysql> CREATE TABLE tb_bookinfobak2 LIKE tb_bookinfo;
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO tb_bookinfobak2 SELECT * FROM tb_bookinfo;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tb_bookinfobak2;
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
| barcode  | bookname  | typeid | author    | ISBN | price | page | bookcase | inTime     | del  | id |
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
| 17120107 | Java King |      3 | LianJiang | 115  | 49.80 |  350 |        1 | 2018-04-17 |    0 |  1 |
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
1 row in set (0.00 sec)

   三、修改表结构

  1.在数据表tb_bookinfobak中添加一个translator字段,并且将inTime的类型由date改为DATETIME(6)

mysql> desc tb_bookinfobak;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| barcode  | varchar(30)      | YES  |     | NULL    |       |
| bookname | varchar(70)      | YES  |     | NULL    |       |
| typeid   | int(10) unsigned | YES  |     | NULL    |       |
| author   | varchar(30)      | YES  |     | NULL    |       |
| ISBN     | varchar(20)      | YES  |     | NULL    |       |
| price    | float(8,2)       | YES  |     | NULL    |       |
| page     | int(10) unsigned | YES  |     | NULL    |       |
| bookcase | int(10) unsigned | YES  |     | NULL    |       |
| inTime   | date             | YES  |     | NULL    |       |
| del      | tinyint(1)       | YES  |     | 0       |       |
| id       | int(11)          | NO   |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

mysql> alter table tb_bookinfobak add translator varchar(30) not null,
    -> modify inTime DATETIME(6);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_bookinfobak;
+------------+------------------+------+-----+---------+-------+
| Field      | Type             | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| barcode    | varchar(30)      | YES  |     | NULL    |       |
| bookname   | varchar(70)      | YES  |     | NULL    |       |
| typeid     | int(10) unsigned | YES  |     | NULL    |       |
| author     | varchar(30)      | YES  |     | NULL    |       |
| ISBN       | varchar(20)      | YES  |     | NULL    |       |
| price      | float(8,2)       | YES  |     | NULL    |       |
| page       | int(10) unsigned | YES  |     | NULL    |       |
| bookcase   | int(10) unsigned | YES  |     | NULL    |       |
| inTime     | datetime(6)      | YES  |     | NULL    |       |
| del        | tinyint(1)       | YES  |     | 0       |       |
| id         | int(11)          | NO   |     | NULL    |       |
| translator | varchar(30)      | NO   |     | NULL    |       |
+------------+------------------+------+-----+---------+-------+
12 rows in set (0.00 sec)

   2.修改约束条件

  (1)添加主键约束格式为Alter TABLE 数据表名 ADD CONSTRAINT 约束名 约束类型 (字段名)

      其中约束类型包括:PRIMARY KEY(主键约束)、DEFAULT(默认值约束)、UNIQUE KEY(唯一约束)、NOT NULL(非空约束)、FOREIGN KEY(外键约束)。

mysql> Alter TABLE tb_bookinfo ADD CONSTRAINT mrprimary PRIMARY KEY(id);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tb_bookinfo;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| barcode  | varchar(30)      | YES  |     | NULL    |       |
| bookname | varchar(70)      | YES  |     | NULL    |       |
| typeid   | int(10) unsigned | YES  |     | NULL    |       |
| author   | varchar(30)      | YES  |     | NULL    |       |
| ISBN     | varchar(20)      | YES  |     | NULL    |       |
| price    | float(8,2)       | YES  |     | NULL    |       |
| page     | int(10) unsigned | YES  |     | NULL    |       |
| bookcase | int(10) unsigned | YES  |     | NULL    |       |
| inTime   | date             | YES  |     | NULL    |       |
| del      | tinyint(1)       | YES  |     | 0       |       |
| id       | int(11)          | NO   | PRI | NULL    |       |
+----------+------------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

   (2)删除约束条件

    删除主键约束:ALTER TABLE 表名 DROP PRIMARY KEY;

    删除外键约束:ALTER TABLE 表名 DROP FOREIGN 约束名;

    删除唯一性约束:ALTER TABLE 表名 DROP INDEX 唯一索引名;

  (3)修改表的其他选项

    修改表的存储引擎:ALTER TABLE 表名 ENGINE=新的存储引擎类型

    修改表的字符集:ALTER TABLE 表名 DEFAULT CHARSET=新的字符集

    修改表的自增类型字段的初始值:ALTER TABLE 表名 AUTO_INCREMENT=新的初始值

  (4)修改表名

    重命名:RENAME TABLE 数据表名1 To 数据表名2

  四、删除表

       DROP TABLE 数据表名;

       DROP TABLE IF EXISTS 数据表名;

  五、设置索引

  1.索引是一种将数据库中单列或者多列的值进行排序的结构。在MySQL中,索引由数据表中的一列或多列组合而成,创建索引的目的是为了优化数据库的查询速度。

     通过索引查询数据,不但可以提高查询速度,也可以降低服务器的负载。创建索引后,用户查询数据时,系统可以不必遍历数据表中的所有记录,而是查询索引列。这样就可以有效地提高数据库系统的整体性能。这和我们通过图书的目录查找想要阅读的章节内容一样,十分方便。

    但是,创建索引和维护需要耗费时间同时还需要占用物理空间,给数据的维护造成很多麻烦。向有索引的表中插入记录时,数据库系统会按照索引进行排序。所以,用户可以将索引删除后再插入数据,当数据插入操作完成后,用户可以重新创建索引。

    常见MySQL索引包括:普通、唯一性、全文、单列、多列、空间。

  2.创建索引

  (1)在建立数据表时创建索引,并且查看表结构。

mysql> CREATE TABLE tb_score(
    -> id int(11) auto_increment primary key not null,
    -> name varchar(50) not null,
    -> math int(5) not null,
    -> english int(5) not null,
    -> chinese int(5) not null,
    -> index(id)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW CREATE TABLE tb_score;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                        |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_score | CREATE TABLE `tb_score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `math` int(5) NOT NULL,
  `english` int(5) NOT NULL,
  `chinese` int(5) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

  (2)在已建立的数据表中创建索引

mysql> CREATE INDEX idx_name ON tb_bookinfo(bookname);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE tb_bookinfo;
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_bookinfo | CREATE TABLE `tb_bookinfo` (
  `barcode` varchar(30) DEFAULT NULL,
  `bookname` varchar(70) DEFAULT NULL,
  `typeid` int(10) unsigned DEFAULT NULL,
  `author` varchar(30) DEFAULT NULL,
  `ISBN` varchar(20) DEFAULT NULL,
  `price` float(8,2) DEFAULT NULL,
  `page` int(10) unsigned DEFAULT NULL,
  `bookcase` int(10) unsigned DEFAULT NULL,
  `inTime` date DEFAULT NULL,
  `del` tinyint(1) DEFAULT '0',
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`bookname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

   3.删除索引

mysql> DROP INDEX idx_name ON tb_bookinfo;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE tb_bookinfo;
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb_bookinfo | CREATE TABLE `tb_bookinfo` (
  `barcode` varchar(30) DEFAULT NULL,
  `bookname` varchar(70) DEFAULT NULL,
  `typeid` int(10) unsigned DEFAULT NULL,
  `author` varchar(30) DEFAULT NULL,
  `ISBN` varchar(20) DEFAULT NULL,
  `price` float(8,2) DEFAULT NULL,
  `page` int(10) unsigned DEFAULT NULL,
  `bookcase` int(10) unsigned DEFAULT NULL,
  `inTime` date DEFAULT NULL,
  `del` tinyint(1) DEFAULT '0',
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

   六、定义约束

  1.定义主键约束

  主键可以使表中的某一列,也可以是表中多个列所构成的一个组合。其中,由多个列组合而成的主键也成为复合主键。

  原则:每个表只能定义一个主键。

        唯一性原则。主键的值必须能够唯一标识表中每一行记录,切不能为NULL。

        最小化规则。复合主键不能包含不必要的多余列。

      一个列名在复合主键的列表中只能出现一次。

  (1)作为列的完成性约束:在表的某个列的属性定义时,加上关键字PRIMARY KEY

mysql> CREATE TABLE tb_manager(
    -> id int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> name varchar(30),
    -> PWD varchar(30)
    -> );
Query OK, 0 rows affected (0.02 sec)

  (2)作为表的完整性约束:在表的所有列的属性定以后,加上PRIMARY KRY(insex_col_name,...)

mysql> create table tb_student(
    -> id int(10) auto_increment,
    -> name varchar(30) not null,
    -> sex varchar(2),
    -> classid int not null,
    -> birthday date,
    -> PRIMARY KEY(id,classid)
    -> );
Query OK, 0 rows affected (0.02 sec)

  2.定义候选键约束

  如果一个属性集能唯一标识元组,且又不含有多余的属性,那么这个属性集称为关系的候选键。候选键的值必须是唯一的,且不能为空。其实现方法与主键约束类似,也是可作为列的完整性约束或者表的完整性约束。候选键和主键的区别有:一个表只能创建一个主键,但可以定义若干个候选键;定义主键约束时,系统会自动创建PRIMARY KEY索引,而定义候选键约束时,系统会自动创建UNIQUE索引。

mysql> CREATE TABLE tb_managerbak(
    -> id int(10) unsigned NOT NULL,
    -> bookname varchar(70) UNIQUE
    -> );
Query OK, 0 rows affected (0.02 sec)

  3.定义非空约束

  通过CREATE TABLE或ALTER TABLE语句中,某个列定义后面加上关键字NOT NULL来定义。

  4.定义CHECK约束

  (1)对列实施CHECK约束,限制其age字段的值只能是7~18(不包括18)

mysql> CREATE TABLE tb_managerbak1(
    -> id int(10) unsigned NOT NULL,
    -> age int not null CHECK(age>6 and age<18)
    -> );
Query OK, 0 rows affected (0.03 sec)

   (2)对表实施CHECK约束,限制其typeid字段的值只能是tb_booktypr表中id字段的某一个id值

mysql> CREATE TABLE tb_managerbak2(
    -> id int(10) unsigned NOT NULL,
    -> typeid int(10) unsigned,
    -> CHECK(typeid IN (SELECT id FROM tb_booktype))
    -> );
Query OK, 0 rows affected (0.03 sec)

 

 

  

posted @ 2018-04-17 11:40  BigJunOba  阅读(1454)  评论(0编辑  收藏  举报