在數據庫中,數據表是數據庫中最重要、最基本的操作對象,是數據存儲的基本單位,數據表被定義為列的集合,數據在表中是按照行和列的格式來存儲的、每一行代表一條唯一的記錄,每一列代表記錄中的一個域.
創建數據表
在創建完數據庫之后,接下來的工作就是創建數據表.所謂創建數據表,指的是在已經創建好的數據庫中建立新表,創建數據表的過程是規定數據列的屬性的過程,同時也是實施數據完整性(包括實體完整性、引用完整性和域完整性等)約束的過程,本節將介紹創建數據表的語法形式、如何添加主鍵約束、外鍵約束、非空約束等.
在創建表之前,應使用use <數據庫名稱>
,進入一個數據庫,以下是一個數據表創建的語法規則:
create table <表名>
(
字段名1,數據類型 [列級別約束條件] [默認值],
字段名2,數據類型 [列級別約束條件] [默認值],
字段名3,數據類型 [列級別約束條件] [默認值],
......
[表級別約束條件]
);
使用create table 創建表,必須指定以下信息:
1.要創建的表名稱,不區分大小寫,且不能使用SQL語句中的關鍵字
2.數據表中的每一個列(字段),的名稱和數據類型,如果創建多列,要用逗號隔開
實例: 根據以下表結構信息,創建一個員工表tb_user
,並查看規則.
字段名稱 | 數據類型 | 備注 |
---|---|---|
id | INT(11) | 員工編號 |
name | VARCHAR(25) | 員工名稱 |
deptId | INT(11) | 所在部門編號 |
salary | FLOAT | 工資 |
1.首先我們先來創建一個lyshark
的數據庫,用來存儲表結構,並指定采用utf8
編碼.
MariaDB [(none)]> create database lyshark charset utf8;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| lyshark |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.01 sec)
MariaDB [(none)]>
2.進入lyshark
這個數據庫,並更具題目要求創建這個表結構.
MariaDB [(none)]> use lyshark
Database changed
MariaDB [lyshark]> create table tb_user
-> (
-> id int(11),
-> name varchar(25),
-> deptId int(11),
-> salary float
-> );
Query OK, 0 rows affected (0.01 sec)
3.查看這個數據表,已經創建成功啦.
MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tb_user |
+-------------------+
1 row in set (0.00 sec)
MariaDB [lyshark]> desc tb_user;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptId | int(11) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
MariaDB [lyshark]>
◆使用主鍵約束◆
主鍵,又稱為主碼,是表中一列或多列的組合.主鍵約束(Primary Key Constraint)要求主鍵列的數據唯一,並且不允許為空.主鍵能夠唯一地標識表中的一條記錄,可以結合外鍵來定義不同數據表之間的關系,並且可以加快數據庫查詢的速度.主鍵和記錄之間的關系如同身份證和人之間的關系,它們之間是一一對應的.主鍵分為兩種類型:單字段主鍵和多字段聯合主鍵.
定義單字段主鍵
實例: 定義一個數據表tab_1
將id
字段定義為主鍵primary key
,其SQL語句的寫法如下:
MariaDB [lyshark]> create table tab_1
-> (
-> id int(10) primary key,
-> name varchar(20),
-> deptid int(10),
-> salary float
-> );
Query OK, 0 rows affected (0.01 sec)
MariaDB [lyshark]>
查看一下表結構,會發現在id
字段上多出來一個key,這就把它定義成主鍵了.
MariaDB [lyshark]> desc tab_1;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(10) | NO | PRI | NULL | | #注意此處key列表,出現了主鍵標識
| name | varchar(20) | YES | | NULL | |
| deptid | int(10) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
在定義主鍵約束時,還可以在表結構定義完成以后,在最后指定主鍵id
.
MariaDB [lyshark]> create table tab_2
-> (
-> id int(10),
-> name varchar(20),
-> deptid int(10),
-> salary float,
-> primary key(id)
-> );
Query OK, 0 rows affected (0.01 sec)
定義多字段主鍵
實例: 定義數據表tab_3
,將name字段與deptid字段組合在一起,成為tab_3
的多字段聯合主鍵.
MariaDB [lyshark]> create table tab_3
-> (
-> name varchar(20),
-> deptid int(10),
-> salary float,
-> primary key(name,deptid)
-> );
Query OK, 0 rows affected (0.00 sec)
查看一下結構吧:
MariaDB [lyshark]> desc tab_3;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(20) | NO | PRI | | |
| deptid | int(10) | NO | PRI | 0 | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
◆使用外鍵約束◆
外鍵用來在兩個表的數據之間建立鏈接,它可以是一列或者多列.一個表可以有一個或多個外鍵,外鍵對應的是參照完整性,一個表的外鍵可以為空值,若不為空值,則每一個外鍵值必須等於另一個表中主鍵的某個值.
外鍵:首先它是表中的一個字段,它可以不是本表的主鍵,但對應另外一個表的主鍵.外鍵主要作用是保證數據引用的完整性,定義外鍵后,不允許刪除在另一個表中具有關聯關系的行.外鍵的作用是保持數據的一致性、完整性.
主表(父表):兩個具有關聯關系的表,相關聯字段中,主鍵所在的那個表既是主表.
從表(子表):兩個具有關聯關系的表,相關聯字段中,外鍵所在的那個表既是從表.
創建外鍵的語法規則:
[constraint <外鍵名>] foreign key 字段名1 [,字段名2,......]
peferences <主表名> 主鍵列1 [,主鍵列2,....]
實例: 創建一個tb_dept
指定為主表,把tb_emp
指定為從表,將兩表指定字段相關聯.
1.首先創建一個部門表tb_dept
,表結構如下所示.
字段名稱 | 數據類型 | 備注 |
---|---|---|
id | INT(11) | 部門編號 |
name | VARCHAR(22) | 部門名稱 |
location | VARCHAR(50) | 部門位置 |
MariaDB [lyshark]> create table tb_dept
-> (
-> id int(11) primary key,
-> name varchar(22) NOT NULL,
-> location varchar(50)
-> );
Query OK, 0 rows affected (0.01 sec)
2接着定義數據表tb_emp
,讓它的deptid字段,作為外鍵關聯到tb_dept
的主鍵id
字段上,SQL語句如下:
MariaDB [lyshark]> create table tb_emp
-> (
-> id int(10) primary key,
-> name varchar(25),
-> deptid int(10),
-> salary float,
-> constraint fk_empdept foreign key(deptid) references tb_dept(id)
-> );
Query OK, 0 rows affected (0.00 sec)
以上語句執行成功后,在表tb_emp
上添加了名稱為fk_empdept
的外鍵約束,外鍵字段為deptid
,其依賴於tb_dept
表中的,主鍵id
.
查看一下結構,理解下吧:
MariaDB [lyshark]> desc tb_dept;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(22) | NO | | NULL | |
| location | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
MariaDB [lyshark]> desc tb_emp;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(10) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptid | int(10) | YES | MUL | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
MariaDB [lyshark]>
◆使用非空約束◆
非空約束(Not Null Constraint)指定字段的值不能為空,對於使用非空約束的字段,如果用戶不給指定數值,則報錯.
非空約束語法規則:
字段名 數據類型 not null
實例:定義數據表tab_4
,指定員工名稱不能為空,SQL語句如下,執行后則name字段將不能為空:
MariaDB [lyshark]> create table tab_4
-> (
-> id int(10) primary key,
-> name varchar(20) not null,
-> salary float
-> );
Query OK, 0 rows affected (0.00 sec)
### ◆使用唯一約束◆
唯一性約束(Unique Constraint):要求該列唯一,允許為空,但只能出現一個空值,唯一約束可以確保數據不重復.
在定義是完列表之后直接指定唯一約束,語法如下:
字段名 數據類型 unique
實例1: 創建tab_5
表,並指定字段name
為唯一約束,SQL語句如下:
MariaDB [lyshark]> create table tab_5
-> (
-> id int(10) primary key,
-> name varchar(20) unique,
-> location varchar(50)
-> );
Query OK, 0 rows affected (0.01 sec)
實例2: 還可以在定義完字段,以后來指定約束條件.
MariaDB [lyshark]> create table tab_6
-> (
-> id int(10) primary key,
-> name varchar(20),
-> location varchar(50),
-> constraint sth unique(name)
-> );
Query OK, 0 rows affected (0.00 sec)
unique
和primary key
區別:一個表可以有多個字段聲明成unique
,但只能有一個primary key
聲明.
◆使用默認約束◆
默認約束(Default Constraint)也就是指定默認值,如果不填寫則自動使用默認值.
默認約束語法規則如下:
字段名 數據類型 default 默認值
實例: 定義一個表名稱tab_7
並指定salary
自動默認工資為500
,如不填寫此項默認是500
.
MariaDB [lyshark]> create table tab_7
-> (
-> id int(10) primary key,
-> name varchar(20) not null,
-> salary float default 500
-> );
Query OK, 0 rows affected (0.00 sec)
◆設置表自增長◆
在數據庫應用中,經常希望在每次插入新記錄時,系統自動生成字段的主鍵值.可以通過為表主鍵添加AUTO_INCREMENT
關鍵字來實現.默認的,在MySQL中AUTO_INCREMENT
的初始值是1,每次新增一條記錄,字段值自動增加1,一個表只能有一個字段使用AUTO_INCREMENT
約束,且字段必須為主鍵的一部分.
設置表的自增長語法規則如下:
字段名 數據類型 auto_increment
實例: 定義一個數據表tab_8
指定id
員工編號為自動增長模式,SQL語句如下:
MariaDB [lyshark]> create table tab_8
-> (
-> id int(10) primary key auto_increment,
-> name varchar(20) not null,
-> salary float
-> );
Query OK, 0 rows affected (0.01 sec)
此處我們插入一些數據,但是不寫ID編號這一欄.
MariaDB [lyshark]> insert into tab_8(name,salary) values('lyshark',1000),('admin',200);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
接着查看一下插入的數據,你會發現ID這一個字段已經自動填充上了.
MariaDB [lyshark]> select * from tab_8;
+----+---------+--------+
| id | name | salary |
+----+---------+--------+
| 1 | lyshark | 1000 |
| 2 | admin | 200 |
| 3 | lyshark | 1000 |
| 4 | admin | 200 |
+----+---------+--------+
4 rows in set (0.00 sec)
## 查詢表結構
使用SQL語句創建好數據表之后,可以查看表結構的定義,以確認表的定義是否正確.在MySQL中,查看表結構可以使用describe
和show create table
語句.
◆desc查詢表結構◆
先來看一下語法格式:
describe 表名稱; or desc 表名稱;
實例: 查詢tab_8
數據表的表結構.
MariaDB [lyshark]> describe tab_8;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
MariaDB [lyshark]> desc tab_8;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
MariaDB [lyshark]>
◆show查詢表結構◆
先來看一下語法格式:
show create table <表名> \G
實例: 顯示tab_8
表的詳細數據信息.
MariaDB [lyshark]> show create table tab_8 \G
*************************** 1. row ***************************
Table: tab_8
Create Table: CREATE TABLE `tab_8` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
注釋: 當然也可以查詢一個數據庫啦,比如查詢lyshark這個數據庫的創建信息.
MariaDB [lyshark]> show create database lyshark;
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| lyshark | CREATE DATABASE `lyshark` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
## 修改數據表
修改表指的是修改數據庫己經存在的數據表的結構.MySQL使用alter table
語句修改表,常用的修改表的操作有:修改表名、修改字段數據類型或字段名、增加和刪除字段、修改字段的排列位置、更改表的存儲引擎、刪除表的外鍵約束等.
◆修改表名稱◆
如果一個數據表名稱需要修改腫莫辦,MySQL中是通過alter table
語句來實現表名稱的修改的,語法規則如下:
alter table <舊表名> rename [to] <新表名>;
實例: 將數據表tab
改名成tab_lyshark
.
MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tab |
| tab_8 |
+-------------------+
2 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab rename to tab_lyshark; #將tab表改成tab_lyshark
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tab |
| tab_lyshark |
+-------------------+
2 rows in set (0.00 sec)
◆修改字段名◆
上面的小例子是修改表的名稱,當我們想要修改字段名稱時,可以使用以下SQL語句:
alter table <表名> change <舊字段名> <新字段名> <新數據類型>
#舊字段名:指修改前的字段名 新字段名:指修改后的字段名 新數據類型:指修改后的數據類型
實例: 將表tab_test
的salary
字段名改為lyshark
並修改數據類型為varchar(30)
.
MariaDB [lyshark]> desc tab_test;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test change salary lyshark varchar(30); #將字段名salary改為lyshark數據類型改成varchar(30)
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
MariaDB [lyshark]>
◆修改字段類型◆
每個字段都會有自己的數據類型,加入有一天你需要修改字段的數據類型,可以使用以下SQL語句:
alter table <表名> modify <字段名> <數據類型>
# 表名:指的是欲修改的表名稱 字段名:欲要修改的字段名 數據類型:你要修改成的類型
實例: 將表tab_test
的name
字段數據類型由varchar(20)
修改為varchar(40)
MariaDB [lyshark]> desc tab_test;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test modify name varchar(40); #將類型從varchar(20)改成varchar(40)
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
MariaDB [lyshark]>
◆添加一個字段◆
隨着業務的需求變化,可能需要在已經存在的表中添加新的字段,一個完整字段包括,字段名,數據類型,完整性約束,添加字段的SQL語法規則如下:
alter table <表名> add <新字段> <數據類型>
# 表名:指定表名稱 新字段:欲要添加的新字段 數據類型:指定添加的類型
# [約束條件] [first | after 已存在字段名]:指的是插入在那個字段前或者后.
在末尾添加: 添加無完整約束條件的字段,在tab_test
表中添加一個int
類型字段manager
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test add manager int(10); #添加一個manager字段,類型為int
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
MariaDB [lyshark]>
在末尾添加: 添加有完整性約束條件的字段,在tab_test
表中添加clound
字段,類型為varchar(20)
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test add clound varchar(20) not null; #添加一個clound字段,並且不允許為空
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
| clound | varchar(20) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
在表開頭添加: 在tab_test
表的第一列添加一個新字段,字段名wang
類型int(4)
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
| clound | varchar(20) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test add wang int(4) first; #在表的第一列添加一個字段名稱是wang,類型是int
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
| clound | varchar(20) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
指定位置添加: 在tab_test
表的指定位置添加一個字段,在name
列的后面插入一個xxxx
字段類型為int
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
| clound | varchar(20) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test add xxxx int(4) after name; #在name字段后面插入一個xxxx,類型int
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| xxxx | int(4) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
| clound | varchar(20) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
◆刪除一個字段◆
有時候我們需要刪除指定無用字段,刪除字段是將數據表中的某個字段從表中移除,這里可以使用alert table drop
命令來完成,SQL語法格式如下:
alter table <表名> drop <字段名>
實例: 刪除tab_test
表中的clound
字段.
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| xxxx | int(4) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
| clound | varchar(20) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test drop clound; #刪除指定字段 clound
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| xxxx | int(4) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
◆修改字段排列位置◆
對於一個表來說,在創建的時候,字段在表中的排列順序就已經確定了,有時候,我們還需要對其進行微調,我們可以這樣寫SQL語句如下:
alter table <表名> modify <字段1> <數據類型> first | after <字段2>
#上面說明,將字段1放到<first|after>字段2的前面或后面
修改到第一列: 將tab_test
表中的lyshark
字段移動到第1列
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| xxxx | int(4) | YES | | NULL | |
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test modify lyshark varchar(30) first; #將lyshark字段調整到最頂端的位置
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| lyshark | varchar(30) | YES | | NULL | |
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| xxxx | int(4) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
修改到指定位置: 把tab_test
表中的manager
字段放到lyshark
字段的后面
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| lyshark | varchar(30) | YES | | NULL | |
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| xxxx | int(4) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
MariaDB [lyshark]> alter table tab_test modify manager int(10) after lyshark; #把manager字段放到lyshark字段的后面
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> desc tab_test;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| lyshark | varchar(30) | YES | | NULL | |
| manager | int(10) | YES | | NULL | |
| wang | int(4) | YES | | NULL | |
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(40) | YES | | NULL | |
| xxxx | int(4) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
◆修改表的存儲引擎◆
存儲引擎是MySQL中的數據存儲在文件或者內存中時采用的不同技術實現,可以根據自己的需要,選擇不同的引擎,甚至可以為每一張表選擇不同的存儲引擎.MySQL中主要存儲引擎有:MyISAM、InnoDB、MEMORY、BDB、FEDERATED等.可以使用show engines
語句查看系統支持的存儲引擎.如下表是MySQL所支持的存儲引擎.
引擎名稱 | 是否支持 |
---|---|
FEDERATED | 否 |
MRG_MYISAM | 是 |
MyISAM | 是 |
BLACKHOLE | 是 |
CSV | 是 |
MEMORY | 是 |
ARCHIVE | 是 |
InnoDB | 默認 |
PERFORMANCE_SCHEMA | 是 |
更改一個表的存儲引擎,可以使用的SQL語法規則:
alter table <表名> engine=<更改后的存儲引擎名稱>
更改引擎: 修改tab_test
表的默認存儲引擎為MyISAM
1.首先我們可以使用show create table
先查看一下當前的存儲引擎是什么,可以看到默認引擎是InnoDB
MariaDB [lyshark]> show create table tab_test \G
*************************** 1. row ***************************
Table: tab_test
Create Table: CREATE TABLE `tab_test` (
`lyshark` varchar(30) DEFAULT NULL,
`manager` int(10) DEFAULT NULL,
`wang` int(4) DEFAULT NULL,
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(40) DEFAULT NULL,
`xxxx` int(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
2.接着執行修改命令,並查看一下變化.
MariaDB [lyshark]> alter table tab_test engine=MyISAM;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> show create table tab_test \G
*************************** 1. row ***************************
Table: tab_test
Create Table: CREATE TABLE `tab_test` (
`lyshark` varchar(30) DEFAULT NULL,
`manager` int(10) DEFAULT NULL,
`wang` int(4) DEFAULT NULL,
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(40) DEFAULT NULL,
`xxxx` int(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 #可以看到已經改變了
1 row in set (0.00 sec)
◆刪除表的外鍵約束◆
對於數據庫定義的外鍵,如果不需要可以將其刪除掉,外鍵一旦刪除,就會解除主表和從表的關聯關系,MySQL中刪除外鍵的語法如下:
alter table <表名> drop foreign key <外鍵約束名>
#外鍵約束名:指的是在定義表時constraint關鍵字后面的參數
刪除外鍵: 刪除tb_emp
的外鍵約束
1.先來查看一下表的外鍵約束.
MariaDB [lyshark]> desc tb_emp;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(10) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptid | int(10) | YES | MUL | NULL | | #外鍵標識MUL
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
MariaDB [lyshark]> show create table tb_emp \G
*************************** 1. row ***************************
Table: tb_emp
Create Table: CREATE TABLE `tb_emp` (
`id` int(10) NOT NULL,
`name` varchar(25) DEFAULT NULL,
`deptid` int(10) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_empdept` (`deptid`),
CONSTRAINT `fk_empdept` FOREIGN KEY (`deptid`) REFERENCES `tb_dept` (`id`) #這里foreign key指定了外鍵
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
2.使用drop foreign key
命令刪除外鍵
MariaDB [lyshark]> alter table tb_emp drop foreign key fk_empdept; #刪除tb_emp表中的外鍵fk_empdept
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [lyshark]> show create table tb_emp \G
*************************** 1. row ***************************
Table: tb_emp
Create Table: CREATE TABLE `tb_emp` (
`id` int(10) NOT NULL,
`name` varchar(25) DEFAULT NULL,
`deptid` int(10) DEFAULT NULL,
`salary` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_empdept` (`deptid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 #此時已經沒有foreign key 這一項了,說明刪除成功
1 row in set (0.00 sec)
## 刪除數據表
刪除數據表就是將數據庫中已存在的表從數據庫移除,需要注意的是,在刪除表的同時,表的定義和表中的所有數據均會被刪除,因此再刪除之前,最好做好備份,刪除的SQL語法如下:
drop table [if exists] 表1,表2,.....表n
#參數 if exists=刪除前判斷刪除的表是否存在,如果表不存在會報錯。
刪除表: 刪除指定表tab_test
MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tab_test |
| tb_dept |
| tb_emp |
+-------------------+
10 rows in set (0.01 sec)
MariaDB [lyshark]> drop table if exists tab_test;
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> show tables;
+-------------------+
| Tables_in_lyshark |
+-------------------+
| tb_dept |
| tb_emp |
+-------------------+
10 rows in set (0.01 sec)
參考文獻:mysql5.7從入門到精通