數據庫就跟一個操作系統一樣, 使用管理員用戶要小心點。
一、庫的創建、修改、刪除
二、表的創建、修改、刪除
一、庫的創建和刪除
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就是把所有關聯的表也一起刪除。
簡單的使用,謝謝大家。