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)

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM