mysql創建修改刪除表和庫

數據庫就跟一個操作系統一樣, 使用管理員用戶要小心點。


一、庫的創建、修改、刪除

二、表的創建、修改、刪除


一、庫的創建和刪除

1、創建

用CREATE DATABASE指令。

我們先看一下幫助

MariaDB [hell]> help CREATE DATABASE;
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification] ...

create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name

試一下:

MariaDB [hell]> CREATE DATABASE testdb;
Query OK, 1 row affected (0.03 sec)
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

DATABASE關鍵字換成SCHEMA也可以,在Oracle數據庫中是Schema。


在庫已存在的情況下這樣會報錯,並退出語句,在執行一個語句腳本的時候不想這樣退出。

可以加上IF NOT EXISTS。語句不會退出,不過會有一個警告。

MariaDB [(none)]> CREATE DATABASE testdb;
ERROR 1007 (HY000): Can't create database 'testdb'; database exists     #報錯並退出
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS testdb;
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [(none)]> SHOW WARNINGS;
+-------+------+-------------------------------------------------+
| Level | Code | Message                                         |
+-------+------+-------------------------------------------------+
| Note  | 1007 | Can't create database 'testdb'; database exists |
+-------+------+-------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [(none)]>

可以修改字符集和排序規則,而不是使用默認的。

create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name
MariaDB [(none)]> CREATE DATABASE testdb2 CHARACTER SET = utf8  COLLATE = utf8_bin;
Query OK, 1 row affected (0.00 sec)


用 SHOW CHARACTER SET; 和SHOW COLLATION;來查詢字符集和排序規則。

排序規則是依附於字符集的。同一個符集有多個排序規則。

查看當前會話默認字符集:可以通過修改變量或配置文件來修改默認字符集。

MariaDB [(none)]> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | latin1                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql5.5.46/share/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.00 sec)



2、修改

MariaDB [testdb1]> help alter database;
Name: 'ALTER DATABASE'
Description:
Syntax:
ALTER {DATABASE | SCHEMA} [db_name]
    alter_specification ...
ALTER {DATABASE | SCHEMA} db_name
    UPGRADE DATA DIRECTORY NAME

alter_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name

一般就是修改字符集和排序規則。

UPGRADE DATA DIRECTORY NAME       

用於重新更新數據庫的數據字典的。 一般只是在數據庫版本升級以後不兼容纔會用。


3、刪除數據庫

用DROP DATABASE指令。

MariaDB [(none)]> HELP DROP DATABASE;
Name: 'DROP DATABASE'
Description:
Syntax:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
MariaDB [(none)]> DROP DATABASE testdb;
Query OK, 0 rows affected (0.00 sec)

這個直接刪除就可以了。


最後說一點:

如果要重命名數據庫,最好的辦法就是把表全部導出來, 然後刪除庫,再新建庫,再導入表。不過代價也是很大的。最好是不要重命名。不要直接在文件系統中重命名數據庫名,也就是目錄名。因爲一些元數據是不會變的。 因此千萬不要直接修改身爲數據庫的目錄名。
最後最好還是不要重命名。



二、表的創建、修改、刪除

1、創建

CREATE TABLE

看一下幫助,這個有點多,不過主要分的是幾個部分。

下面就是總的部分,創建表的主要指令。

MariaDB [(none)]> help create table;
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name    #TEMPORARY臨時表,在內存中的。只有管理員可以使用。
    (create_definition,...)         #定義創建表的信息,主要是與字段相關的。在一個大括號。
    [table_options]                 #關於表的選項。
    [partition_options]            #劃分表,這個就不說了。

Or:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    select_statement

Or:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }

三種創建方式。第一種就是一般創建,第二種是通過查詢到的數據填充到表裏,表結構自動定義,第三種是根據另一張表的結構來自動創建表。暫時先只說第一種方式的。


舉個例子看看

MariaDB [(none)]> use testdb1;    #默認數據庫
Database changed
MariaDB [testdb1]> CREATE TABLE tab1 (Name char(20));    #創建表
Query OK, 0 rows affected (0.04 sec)

MariaDB [testdb1]>

創建一個簡單的表tab1。括號裏面的就是定義的表的信息了,Name字段,char數據類型,長度20。

看一下下面這個,就是定義的格式了。


定義創建表的信息。

create_definition:
    col_name column_definition    
  | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
      [index_option] ...
  | {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
      [index_name] [index_type] (index_col_name,...)
      [index_option] ...
  | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] FOREIGN KEY
      [index_name] (index_col_name,...) reference_definition
  | CHECK (expr)

包括字段名稱字段定義或者是約束和索引

約束和索引可以先不去管它,只要知道這裏是專門單獨的給各個字段定義約束和索引的。

而在字段定義中也可以給所對應的字段定義一些約束。

上面的約束和索引包括:

上面的CONSTRAINT是可以省略的。

PRIMARY KEY 定義主鍵約束

UNIQUE 唯一鍵約束

FULLTEXT|SPATIAL 是用來定義全文和空間索引。

FOREIGN KEY 外鍵約束

CHECK 條件約束


字段定義的說明部分:

column_definition:
    data_type [NOT NULL | NULL] [DEFAULT default_value]
      [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]    
      [COMMENT 'string']
      [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
      [STORAGE {DISK|MEMORY|DEFAULT}]
      [reference_definition]

字段的定義又包括數據類型和類型修改符。數據類型太多了,就不帖出來了。


AUTO_INCREMENT:  自動增長

UNIQUE 唯一鍵約束

PRIMARY KEY  主鍵終束

COMMENT: 註釋信息


使用大致就是:

CREATE TABLE table_name (col_name data_type 類型修飾 | 約束) table_option


再舉個例子:

MariaDB [testdb1]> CREATE TABLE tab2 (Name CHAR(20) NOT NULL UNIQUE);
Query OK, 0 rows affected (0.05 sec)

MariaDB [testdb1]> CREATE TABLE tab6 (ID int UNSIGNED AUTO_INCREMENT PRIMARY KEY,Name CHAR(20));
Query OK, 0 rows affected (0.02 sec)

MariaDB [testdb1]> CREATE TABLE tab7 (ID int UNSIGNED AUTO_INCREMENT,Name CHAR(20),PRIMARY KEY (id));
Query OK, 0 rows affected (0.09 sec)

MariaDB [testdb1]>

第一個是創建有非空和唯一約束的字段Name。

第二個的UNSIGNED是int數據類型的一部分,表示無符號的。並且是直接在字段中定義了主鍵約束。

第三個在字段之外單獨給字段定義主鍵約束。


還有表選項,主要會用到的:
ENGINE [=] engine_name
AUTO_INCREMENT [=] value    指定AUTO_INCREMENT從幾開始的。
[DEFAULT] CHARACTER SET [=] charset_name    字符集。
[DEFAULT] COLLATE [=] collation_name
COMMENT [=] 'string'                給表加註釋
DELAY_KEY_WRITE [=] {0 | 1}    延遲寫入,合併多個寫入請求,一次性寫入。
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}  表格式。
TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
可以指定所存放的表空間文件, 還可以指定放在DESK或MEMORY內存中。DEFAULT一般就是指DISK。


MariaDB [testdb1]> CREATE TABLE tab8 (ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, Name CHAR(25) NOT NULL,age TINYINT UNSIGNED NOT NULL, gender ENUM('M','N') NOT NULL, ps VARCHAR(50)) ENGINE=MyISAM COMMENT 'test table';
Query OK, 0 rows affected (0.05 sec)

MariaDB [testdb1]> SHOW TABLE STATUS LIKE 'tab8'\G
*************************** 1. row ***************************
           Name: tab8
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 281474976710655
   Index_length: 1024
      Data_free: 0
 Auto_increment: 1
    Create_time: 2015-11-01 04:12:47
    Update_time: 2015-11-01 04:12:47
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: test table
1 row in set (0.00 sec)

MariaDB [testdb1]> 
MariaDB [testdb1]> DESC tab8;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| ID     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| Name   | char(25)            | NO   |     | NULL    |                |
| age    | tinyint(3) unsigned | NO   |     | NULL    |                |
| gender | enum('M','N')       | NO   |     | NULL    |                |
| ps     | varchar(50)         | YES  |     | NULL    |                |
+--------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [testdb1]>


第二種方式是用SELECT來從別的表獲取數據,再用這些數據填充出來一張表。不過跟原來的表結構就不同了。這樣,我們先在剛纔的表裏插入一些數據。

MariaDB [testdb1]> INSERT INTO tab8 (Name,age,gender) VALUES ('XIAOA',25,'M'),('ZHANGSAN',30,'M'),('XIAOHUI',28,'N');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [testdb1]> SELECT * FROM tab8;
+----+----------+-----+--------+------+
| ID | Name     | age | gender | ps   |
+----+----------+-----+--------+------+
|  4 | XIAOA    |  25 | M      | NULL |
|  5 | ZHANGSAN |  30 | M      | NULL |
|  6 | XIAOHUI  |  28 | N      | NULL |
+----+----------+-----+--------+------+
3 rows in set (0.00 sec)

MariaDB [testdb1]>


試一下:

MariaDB [testdb1]> CREATE TABLE tab9 SELECT * FROM tab8;
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [testdb1]> DESC tab9;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| ID     | int(10) unsigned    | NO   |     | 0       |       |
| Name   | char(25)            | NO   |     | NULL    |       |
| age    | tinyint(3) unsigned | NO   |     | NULL    |       |
| gender | enum('M','N')       | NO   |     | NULL    |       |
| ps     | varchar(50)         | YES  |     | NULL    |       |
+--------+---------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

跟原來的表對比一下就發現ID的主鍵約束沒有了,自動增長也沒有了。


第三種方式是專門用來複製表結構的。

MariaDB [testdb1]> CREATE TABLE tab10 LIKE tab8;
Query OK, 0 rows affected (0.01 sec)

tab10與tab8的結構一模一樣,不過是空的。不過如果想把tab8的數據複製過來,可以用INSERT INTO 的SELECT自動的加入數據。


2、修改

alter table

MariaDB [testdb1]> help alter table;
Name: 'ALTER TABLE'
Description:
Syntax:
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
    [alter_specification [, alter_specification] ...]
    [partition_options]

在alter_specification裏面主要就是:

ADD新字段或索引,ALTER給字段修改或增加默認值,change字段重命名、定義屬性還有字段的位置(排在第幾個字段),MODIFY修改字段定義和位置,DROP刪除字段,rename表重命名,ORDER BY指定排序標準的字段,CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]  轉換字符集及排序規則,還有表項(與創建表時候的表項一樣)。


舉例子說明吧

ADD

ADD [COLUMN] col_name column_definition
        [FIRST | AFTER col_name ]

ADD添加字段。class字段,數據類型 char,默認值'math'。上面的first是把字段放到第一個位置,after就是在某個字段之後。

MariaDB [testdb1]> ALTER TABLE tab8 ADD class CHAR(30) DEFAULT 'math';
Query OK, 4 rows affected (0.02 sec)               
Records: 4  Duplicates: 0  Warnings: 0

只添加單個字段可以這樣,如果一下添加多個字段就要用括號括起來,並用逗號分割各個字段。

MariaDB [testdb1]> ALTER TABLE tab8 ADD (weight tinyint unsigned, height tinyint unsigned);
Query OK, 4 rows affected (0.01 sec)               
Records: 4  Duplicates: 0  Warnings: 0


ALTER:給gender字段添加默認值爲'M'。

MariaDB [testdb1]> ALTER TABLE tab8 ALTER gender SET DEFAULT 'M';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0


CHANGE:class字段改爲course,並放到Name字段的後面。 每次改名必須要重新定義字段。

MariaDB [testdb1]> ALTER TABLE tab8 CHANGE class course char(30) default 'math' AFTER Name;
Query OK, 4 rows affected (0.02 sec)               
Records: 4  Duplicates: 0  Warnings: 0
MariaDB [testdb1]> DESC tab8;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| ID     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| Name   | char(25)            | NO   |     | NULL    |                |
| course | char(30)            | YES  |     | math    |                |
| age    | tinyint(3) unsigned | NO   |     | NULL    |                |
| gender | enum('M','N')       | NO   |     | M       |                |
| ps     | varchar(50)         | YES  |     | NULL    |                |
| PPS    | char(39)            | YES  |     | NULL    |                |
| weight | tinyint(3) unsigned | YES  |     | NULL    |                |
| height | tinyint(3) unsigned | YES  |     | NULL    |                |
+--------+---------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)


MODIFY:gender的enum類型值寫錯了,改一下。

MariaDB [testdb1]> ALTER TABLE tab8 MODIFY gender ENUM('M','F');
Query OK, 4 rows affected, 2 warnings (0.01 sec)   
Records: 4  Duplicates: 0  Warnings: 2

有警告,因爲我們表裏面有數據,原來爲N的值變成空了。可以用update重新賦值。如:

MariaDB [testdb1]> UPDATE tab8 SET gender = 'F' WHERE gender=''; #這裏表示是空字符,如果用gender IS NULL,就不行了。
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0


DROP:刪除字段。

MariaDB [testdb1]> ALTER TABLE tab8 DROp ps;
Query OK, 4 rows affected (0.00 sec)               
Records: 4  Duplicates: 0  Warnings: 0


RENAME:

MariaDB [testdb1]> ALTER TABLE tab8 RENAME TO tab0;
Query OK, 0 rows affected (0.01 sec)

MariaDB [testdb1]>

修改表名有個專門的指令,就叫做RENAME.

mysql> RENAME TABLE old_name TO new_name;



修改表項中的存儲引擎的時候注意一下。

修改引擎的背後工作機制 是創建一個所指定引擎的新表, 並把老的表中的數據導入新表中,是存在風險的。


都是簡單的用法,複雜的就朋友們自己研究吧。


3、刪除

MariaDB [testdb1]> help drop table;
Name: 'DROP TABLE'
Description:
Syntax:
DROP [TEMPORARY] TABLE [IF EXISTS]
    tbl_name [, tbl_name] ...
    [RESTRICT | CASCADE]

這個就不舉例子了,注意的是CASCADE,有時候一個表是被另一個表所關聯的。加上CASCADE就是把所有關聯的表也一起刪除。



簡單的使用,謝謝大家。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章