mysql表结构管理_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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值