MySQL視訊筆記
已經發布部落格
慕課網的免費課程
綜合評分:9.7
非常高,聽後效果也是很好,沒有廢話,都是乾貨,總共8.5小時,讓你對MySQL有個初步瞭解。
https://www.imooc.com/learn/122
'''
#2018-06-19 484508 June Tuesday the 25 week, the 170 day SZ
C:\Users\z003tesj>mysql -uroot -p044500 -P3306 -h127.0.0.1
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.5.59 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
'''
與MySQL的零距離接觸
左下角開始輸入cmd,回車,
開啟mysql:
net start mysql
登陸MySQL客戶端:
mysql -uroot -p044500 -P3306 -h127.0.0.1
或者:
mysql -uroot -p044500
出現mysql>說明成功登陸了,
然後就進入系統,展示所有的資料庫:
mysql> SHOW DATABASES;
選擇一個數據庫,要不然會報錯:ERROR 1046(3D000): No Database Selected
接著使用資料庫:
mysql> USE test
顯示所有的列表:
SHOW TABLES;
顯示列表中某個內容:
SHOW COLUMNS FROM users;
顯示users的具體內容:
SELECT * FROM users;
##############################################
SHOW DATABASE;
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| t2 |
| test |
+--------------------+
5 rows in set (0.01 sec)
SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| provinces |
| tb1 |
| tb2 |
| tb3 |
| tb4 |
| tb5 |
| tb6 |
| users1 |
| users3 |
+----------------+
SHOW TABLES FROM mysql;
SHOW COLUMNS FROM tb3;
SHOW TABLES;
SHOW COLUMNS;
SHOW CREATE TABLE provinces;
SHOW INDEXES FROM provinces;
SHOW COLUMNS FROM user;
SHOW CREATE TABLE users1;
mysql> CREATE TABLE users(
->
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT
-> username VARCHAR(20) NOT NULL,
-> password VARCHAR(20) NOT NULL,
-> age TINYINT UNSIGNED NOT NULL DEFAULT 10,
-> sex BOOLEAN
-> );
mysql> SHOW COLUMNS FROM users;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | NO | | NULL | |
| password | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | NO | | 10 | |
| sex | tinyint(1) | YES | | NULL | |
+----------+----------------------+------+-----+---------+----------------+
mysql> SELECT * FROM users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 25 | 1 |
+----+----------+----------+-----+------+
1 row in set (0.00 sec)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
登陸MySQL客戶端:
mysql -uroot -p044500
出現mysql>說明成功登陸了
接著使用資料庫
程式碼:
USE test;
接著建立資料表:
程式碼:
CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);
MySQL基礎
1.1
瑞典 MySQL AB公司開發,目前屬於Oracle公司,開源關係型資料庫
社群版和企業版
Server version: 5.5.59 MySQL Community Server (GPL)
1.2 、安裝
MSI安裝方式
MySQL Server 5.5 安裝
下載地址
https://dev.mysql.com/downloads/mysql/
C:\Program Files\MySQL\MySQL Server 5.5\bin\
MySQLInstanceConfig.exe
該檔案進行配置
detailed Configuration不用,因為麻煩
我們選擇standard configuration
下一步選擇install as windows service
launch the mysql server
include bin directory in windows path新增到Windows路徑
下一步:modify security settings
password 044500
root是超級使用者
bin儲存可執行檔案
data儲存資料檔案
docs,文件目錄
include包含的標頭檔案
lib庫檔案
share錯誤資訊和字符集檔案
修改編碼方式:
C:\Program Files\MySQL\MySQL Server 5.5\my.ini
雙擊my.ini
port埠號 3306
在port=3306後面修改編碼格式為utf8
搜尋“default-character-set”將其改為utf8,
搜尋“character-set-server=utf8”將其改為utf8
按照老師要求,修改完後,發現無法儲存。
解決辦法:修改後另存為桌面,然後把桌面修改好的my.ini複製到路徑替換以前的my.ini
1.3
啟動mysql
控制欄輸入
C:\Users\z003tesj>net start mysql
停止服務:net stop mysql
但是會報錯:System error 5 has occurred. Access is denied."
解決方案,
先關閉mysql,
在開始的附件裡找到 command prompt右擊,用管理員模式開啟就解決了。
說明系統正確配置和啟動了
1.4
mysql登陸和退出
cls清屏
檢視版本
C:\Windows\system32>mysql -V
mysql Ver 14.14 Distrib 5.5.59, for Win64 (AMD64)
-u使用者名稱
-P埠號
-p密碼
--prompt=name設定使用者名稱
-h伺服器名稱
-D開啟指定資料庫
--delimiter=name指定分隔符
管理員許可權使用者名稱
mysql -uroot -p
C:\Windows\system32>mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.59 MySQL Community Server (GPL)
本地迴環 地址-h127.0.0.1
mysql> mysql -uroot -p -P3306 -h127.0.0.1
預設0006埠和本地伺服器
所以-P3306 和h 也可以不寫
退出:exit or quit or \q
mysql> mysql -uroot -p -P3306 -h127.0.0.1
-> \q
Bye
按下鍵盤的上下箭頭,讓命令重新出現,選擇自己需要的命令就行
1.5
修改MySQL提示符
1》連線客戶端時候通過引數指定:shell>mysql -uroot -proot --prompt 提示符
連線上客戶端後,通過prompt命令修改
mysql>prompt提示符
C:\Windows\system32>mysql -uroot -p044500 --prompt \h
提示符:
\D 完整日期
\d 當前資料庫
\h 伺服器名稱
\u 當前使用者
root使用者名稱
localhost伺服器名稱
(none)當前資料庫
以下是命令列的內容
localhost
localhostprompt mysql
PROMPT set to 'mysql'
mysqlPROMPT \[email protected]\h \d
PROMPT set to '\[email protected]\h \d'
[email protected] (none)USE test
Database changed
[email protected] test
USE test是還沒有學過的命令
1.6
MySQL常用命令以及語法規範
SELECT VERSION();
顯示當前伺服器版本號
SELECT NOW();
顯示當前時間
SELECT USER();
顯示當前使用者
MySQL語句的規範
關鍵字和函式名稱全部大寫
2資料庫名稱,表名稱,欄位名稱全部小寫
3SQL語句必須用分好結尾
1.7 操作資料庫
系統自帶四個資料庫
建立資料庫:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
大括號是必選項,中括號是可選項,|是從中做個選擇,取出一個就行
localhost testSHOW DATABASE;
localhost testSHOW DATABASES;
檢視當前伺服器下的資料庫列表
SHOW {DATABASES | SCHEMAS}
[LIKE 'pattern' | WHERE expr]
建立資料庫
[email protected] testCREATE DATABASE IF NOT EXISTS t1;
Query OK, 1 row affected, 1 warning (0.00 sec)
[email protected] testSHOW WARNINGS;
[email protected] testSHOW CREATE DATABASE t1;
[email protected] testCREATE DATABASE IF NOT EXISTS t2;
這樣t2就被建立了
修改資料庫
ALTER {DATABASE | SCHEMA} [db_name]
[DEFAULT] CHARACTER SET [=] charset_name
控制欄:
[email protected] testALTER DATABASE t2 CHARACTER SET = gbk;
刪除資料庫
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
刪除時候一定要儲存資料庫的存在。
控制欄:
[email protected] testDROP DATABASE t2
-> ;
Query OK, 0 rows affected (0.01 sec)
如果忘記寫分號,可以在下一行繼續補上分號就行。
[email protected] testSHOW DATABASES;
顯示目前的資料庫列表
2-1
內容回顧:
MySQL基礎
安裝MySQL
配置MySQL
使用MySQL
預設埠號:3306
超級使用者名稱:root
建立資料庫:CREATE DATABASE
修改資料庫:ALTER DATABASE
刪除資料庫:DROP DATABASE
2-2 MySQL資料型別之整型
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT,
2-3 資料型別之浮點型
單精度浮點
FLOAT[(M,D)]
雙精度DOUBLE[(M,D)]
M是數字總位數,D是小數點後面的位數,
2-4 資料型別之日期,時間
YEAR, TIME, DATE, DATETIME, TIMESTAMP,
2-5MySQL資料型別之字元型
CHAR(M), VARCHAR(M), TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, ENUM('value', 'value2',....)
SET('value1', 'value2',...)
2-6
MySQL建立資料表
資料表是其他物件的基礎,二維表格,行,列
行:記錄,
列:欄位
USE開啟某個資料庫
USE 資料庫名稱;
控制欄登陸資料庫程式碼:
#ntsqk -yriit -p044500 -P3306 -h127.0.0.1
mysql -uroot -p004500 -P3306 -h127.0.0.1
USE test;
SELECT DATABASE();
建立資料表
CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type, ...)
控制欄程式碼:
[email protected] testCREATE TABLE tb1(
-> username VARCHAR(20),
-> age TINYINT UNSIGNED,
-> salary FLOAT(8,2) UNSIGNED
-> );
Query OK, 0 rows affected (0.03 sec)
2-7 MySQL檢視資料表
SHOW TABLES[FROM db_name] [LIKE 'pattern' | WHERE expr]
控制欄程式碼:
[email protected] testSHOW TABLES;
顯示test使用者裡面的tables
[email protected] testSHOW TABLES FROM mysql;
顯示mysql裡面所有的資料表
[email protected] testSELECT DATABASE();
2-8
檢視資料表結構
SHOW COLUMNS FROM tbl_name
控制欄內容:
2-9 MySQL記錄的插入與查詢
插入記錄:
INSERT [INTO] tbl_name[ (col_name,...)] VALUESE(val,...)
列名字可以省略,但是要給所有列都賦值
程式碼:
[email protected] testINSERT tb1 VALUES('Tom', 25);
給某部分賦值
程式碼:
INSERT tb1(username,salary) VALUES('JOHN', 9666.68);
記錄查詢
SELECT expr,... FROM tbl_name
程式碼:
SELECT * FROM tb1;
2-10 MySQL空值與非空
新增相應屬性
NULL, 欄位值可以為空
NOT NULL, 欄位值禁止為空
程式碼:
CREATE TABLE tb2(
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED NULL);
INSERT tb2 VALUES('tom',NULL);
SELECT * FROM tb2;
INSERT tb2 VALUES(NULL, 26);
2-11 MySQL自動編號
AUTO_INCREMENT
自動編號,必須和主鍵組合使用
預設情況,起始值是1,增量是1,增量為整數,如果是為浮點數,小數位數為零,
程式碼:
CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT, username VARCHAR(30) NOT NULL);
報錯:
ERROR 1075 (42000): Incorrect table definition; there can be only one auto colum
n and it must be defined as a key
必須定義一個主鍵為自動列
2-12 MySQL初涉主鍵約束
主鍵約束
每張資料表只能存在一個主鍵
主鍵保證記錄的唯一性
主鍵自動為NOT NULL
程式碼:
CREATE TABLE tb3(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL);
[email protected] testSHOW COLUMNS FROM tb3;
INSERT tb3(username) VALUES('TOM');
INSERT tb3(username) VALUES('JOHN');
INSERT tb3(username) VALUES('JOHN');
INSERT tb3(username) VALUES('ROSE');
INSERT tb3(username) VALUES('DIMITAR');
SELECT * FROM tb3;
程式碼:
CREATE TABLE tb4(id SMALLINT UNSIGNED PRIMARY KEY, username VARCHAR(20) NOT NULL);
SHOW COLUMNS FROM tb4;
INSERT tb4 VALUES(4,'TOM');
INSERT tb4 VALUES(22,'JOHN');
SELECT*FROM tb4;
2-13 MySQL初涉唯一約束
UNIQUE KEY
唯一約束
保證記錄的唯一性
唯一約束的欄位可以為空值NULL
每張資料表可以存在多個唯一約束
程式碼:
CREATE TABLE tb5(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE KEY, age tinyint UNSIGNED);
[email protected] testSHOW COLUMNS FROM tb5;
INSERT tb5(username, age) VALUES('Tom',22);
2-14
MySQL初涉預設約束
DEFAULT
預設值
當插入記錄時候,如果沒有明確為欄位賦值,則自動賦予預設值
程式碼:
CREATE TABLE tb6(id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE KEY, sex ENUM('1','2','3') DEFAULT '3');
作業系統
程式碼:
SHOW COLUMNS FROM tb6;
INSERT tb6(username) VALUES('Tom');
SELECT * FROM tb6;
沒有賦值時候,系統預設賦值3
2-15 總結
資料型別:字元型,整型,浮點型,日期時間型
SHOW TABLES;
SHOW COLUMNS;
檢視資料表真實結構
資料表操作:INSERT插入記錄,SELECT查詢記錄
記錄操作:建立資料表,約束的使用
3-1 回顧和概述
資料表操作:建立,PRIMARY KEY(主鍵約束),UNIQUE KEY(唯一約束),DEFAULT(預設約束),NOT NULL(非空約束)
記錄插入,查詢
3-2 MySQL 外來鍵約束的要求解析
約束:
保證資料的一致性和完整性
約束分為表級約束和列級約束
約束型別包括:
非空約束,主鍵約束,唯一約束,預設約束,外來鍵約束FOREIGN KEY
外來鍵約束:保證資料一致性,完整性,實現一對一或者一對多關係
外來鍵約束的要求:
父表和子表必須使用相同的儲存引擎,而且禁止使用臨時表。
2 資料表的儲存引擎只能為InnoDB
3外來鍵列和參照列必須具有相似的資料型別。數字的長度及是否有符號位必須相同;而字元長度可以不同。
4外來鍵列和參照列必須建立索引。如果外來鍵列不存在索引的話,MySQL將會自動建立索引。
具有外來鍵列的表為子表,子表所參照的表為父表
外來鍵列:forray參照的列
編輯資料表的預設儲存引擎
配置檔案my.ini修改為:default-storage-engine =INNODB
登陸MySQL客戶端:
mysql -uroot -p044500
出現mysql>說明成功登陸了
接著使用資料庫
程式碼:
USE test;
接著建立資料表:
程式碼:
CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);
檢視預設儲存引擎:
程式碼:
SHOW CREATE TABLE provinces;
檢查:外來鍵列和參照列必須具有相似的資料型別。
程式碼:
CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid BIGINT, FOREIGN KEY (pid) REFERENCES provinces (id) );
CREATE TABLE users1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE);
以上是錯誤程式碼,因為資料型別長度和符號都不同。
修改為:
CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username, VARCHAR(20) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) );
pid是省份編號,pname是省份名字
判斷是否建立索引:
SHOW INDEXES FROM provinces;
SHOW COLUMNS FROM user;
3-3
外來鍵約束的參照操作
3-3
程式碼:
CREATE TABLE users1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(10) NOT NULL, pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE);
mysql> SHOW CREATE TABLE users1;
CASCADE: 從父表刪除或者更新且自動刪除或者更新子表中匹配的行。
SET NULL:從父表刪除或更新行,並設定子表中的外來鍵列為NULL。如果使用該選項,必須保證子表列沒有指定NOT NULL
RESTRICT:拒絕對父表的刪除或者更新操作
NO ACTION:標準SQL的關鍵字,在MySQL中與RESTRICT相同。
程式碼:
INSERT provinces(pname) VALUES('A');
INSERT provinces(pname) VALUES('B');
INSERT provinces(pname) VALUES('C');
SELECT * FROM provinces;
INSERT users1(username,pid) VALUES('Tom', 3);
INSERT users1(username,pid) VALUES('Tom',6);
INSERT users1(username,pid) VALUES('John',1);
INSERT users1(username,pid) VALUES('Rose',3);
SELECT * FROM users1;
DELETE FROM provinces WHERE id = 3;
3.3結束。
3-4 表級約束和列級約束
對一個數據列建立的約束稱為列級約束,
對多個數據列建立的約束稱為表級約束。
列級約束可以在列定義前後生命,表級約束只能在列定義後宣告。
3-5
MySQL 修改資料表-新增/刪除列
新增單列:
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]
FIRST表示新增的列在最前面
AFTER col_name 表示新增的列在col_name後面
沒有FIRST 或者AFTER 新增的列位於所有列的最下面
看一下users1資料表的結構
程式碼:
mysql> SHOW COLUMNS FROM users1;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(10) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
+----------+----------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
新增一列
程式碼:
mysql> ALTER TABLE users1 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 10;
Query OK, 1 row affected (0.05 sec)
Records: 1 Duplicates: 0 Warnings: 0
程式碼:
mysql> SHOW COLUMNS FROM users1;
mysql> SHOW COLUMNS FROM users1;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(10) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| age | tinyint(3) unsigned | NO | | 10 | |
+----------+----------------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)
看來age確實被新增到了末尾,first可以新增到開頭,after 可以指定新增到某行後面。
在username後面新增password:
mysql> ALTER TABLE users1 ADD password VARCHAR(32) NOT NULL AFTER username;
Query OK, 1 row affected (0.06 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM users1;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(10) | NO | | NULL | |
| password | varchar(32) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| age | tinyint(3) unsigned | NO | | 10 | |
+----------+----------------------+------+-----+---------+----------------+
5 rows in set (0.04 sec)
在頭部新增truename。用first
mysql> ALTER TABLE users1 ADD truename VARCHAR(20) NOT NULL FIRST;
Query OK, 1 row affected (0.07 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM users1;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| truename | varchar(20) | NO | | NULL | |
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(10) | NO | | NULL | |
| password | varchar(32) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| age | tinyint(3) unsigned | NO | | 10 | |
+----------+----------------------+------+-----+---------+----------------+
6 rows in set (0.04 sec)
新增多列只可以在列的最後依次新增,不可以隨機新增。
刪除列:
ALTER TABLE tbl_name DROP [COLUMN] col_name
刪除一個
mysql> ALTER TABLE users1 DROP truename;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
一次刪除兩個列。
mysql> ALTER TABLE users1 DROP password, DROP age;
Query OK, 1 row affected (0.05 sec)
Records: 1 Duplicates: 0 Warnings: 0
3.5結束
3-6 MySQL 修改資料表--新增約束
新增主鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
建立一張廢表users2
mysql> CREATE TABLE users2(
-> username VARCHAR(10) NOT NULL,
-> pid SMALLINT UNSIGNED);
Query OK, 0 rows affected (0.02 sec)
mysql> SHOW CREATE TABLE users2;
+--------+----------------------------------------------------------------------
---------------------------------------------------------------------+
| Table | Create Table
|
+--------+----------------------------------------------------------------------
---------------------------------------------------------------------+
| users2 | CREATE TABLE `users2` (
`username` varchar(10) NOT NULL,
`pid` smallint(5) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+----------------------------------------------------------------------
---------------------------------------------------------------------+
1 row in set (0.00 sec)
這個表目前沒有主鍵,下面新增主鍵。
mysql> ALTER TABLE users2 ADD id smallint unsigned;
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM users2;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| username | varchar(10) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | | NULL | |
| id | smallint(5) unsigned | YES | | NULL | |
+----------+----------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
把id設定成主鍵: PK是主鍵primary key的意思
mysql> ALTER TABLE users2 ADD CONSTRAINT PK_user2_id PRIMARY KEY(id);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM users2;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| username | varchar(10) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | | NULL | |
| id | smallint(5) unsigned | NO | PRI | 0 | |
+----------+----------------------+------+-----+---------+-------+
3 rows in set (0.02 sec)
新增唯一約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name, ...)
假設為username新增唯一約束
程式碼:
mysql> ALTER TABLE users2 ADD UNIQUE (username);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE users2;
+--------+---------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-------------------+
| Table | Create Table
|
+--------+---------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-------------------+
| users2 | CREATE TABLE `users2` (
`username` varchar(10) NOT NULL,
`pid` smallint(5) unsigned DEFAULT NULL,
`id` smallint(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+---------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-------------------+
1 row in set (0.00 sec)
新增外來鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition
mysql> SHOW COLUMNS FROM provinces;
+-------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| pname | varchar(20) | NO | | NULL | |
+-------+----------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> ALTER TABLE users2 ADD FOREIGN KEY (pid) REFERENCES provinces (id)
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE users2;
+--------+---------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
----------------------------------------+
| Table | Create Table
|
+--------+---------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
----------------------------------------+
| users2 | CREATE TABLE `users2` (
`username` varchar(10) NOT NULL,
`pid` smallint(5) unsigned DEFAULT NULL,
`id` smallint(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
KEY `pid` (`pid`),
CONSTRAINT `users2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+---------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-------------------------------------------------------------------------
----------------------------------------+
1 row in set (0.00 sec)
新增/刪除 預設約束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
給users2新增表age,
mysql> ALTER TABLE users2 ADD age TINYINT UNSIGNED NOT NULL;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
顯示所有的 列
mysql> SHOW COLUMNS FROM users2;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| username | varchar(10) | NO | UNI | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| id | smallint(5) unsigned | NO | PRI | 0 | |
| age | tinyint(3) unsigned | NO | | NULL | |
+----------+----------------------+------+-----+---------+-------+
4 rows in set (0.05 sec)
改變users2表裡面的age列為預設15,
mysql> ALTER TABLE users2 ALTER age SET DEFAULT 15;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
顯示錶users2裡面的列
mysql> SHOW COLUMNS FROM users2;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| username | varchar(10) | NO | UNI | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| id | smallint(5) unsigned | NO | PRI | 0 | |
| age | tinyint(3) unsigned | NO | | 15 | |
+----------+----------------------+------+-----+---------+-------+
4 rows in set (0.02 sec)
刪除表users2裡面的age
mysql> ALTER TABLE users2 ALTER age DROP DEFAULT;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM users2;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| username | varchar(10) | NO | UNI | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| id | smallint(5) unsigned | NO | PRI | 0 | |
| age | tinyint(3) unsigned | NO | | NULL | |
+----------+----------------------+------+-----+---------+-------+
4 rows in set (0.03 sec)
3.6結束
3-7 MySQL 修改資料表--刪除約束
刪除主鍵約束
ALTER TABLE tbl_name DROP PRIMARY KEY
主鍵後面沒有加名稱,因為任何資料表有且僅有一個主鍵
mysql> ALTER TABLE users2 DROP PRIMARY KEY;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
檢視資料表的結構:
mysql> SHOW COLUMNS FROM users2;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| username | varchar(10) | NO | PRI | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| id | smallint(5) unsigned | NO | | 0 | |
| age | tinyint(3) unsigned | NO | | NULL | |
+----------+----------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
確實沒有了主鍵id
刪除唯一約束:
ALTER TABLE tbl_name DROP {INDEX|KEY} index_name
mysql> SHOW INDEXES FROM users2;
+--------+------------+----------+--------------+-------------+-----------+-----
--------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Card
inality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+----------+--------------+-------------+-----------+-----
--------+----------+--------+------+------------+---------+---------------+
| users2 | 0 | username | 1 | username | A |
0 | NULL | NULL | | BTREE | | |
| users2 | 1 | pid | 1 | pid | A |
0 | NULL | NULL | YES | BTREE | | |
+--------+------------+----------+--------------+-------------+-----------+-----
--------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
用網格的形式表現
mysql> SHOW INDEXES FROM users2\G;
*************************** 1. row ***************************
Table: users2
Non_unique: 0
Key_name: username
Seq_in_index: 1
Column_name: username
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: users2
Non_unique: 1
Key_name: pid
Seq_in_index: 1
Column_name: pid
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.00 sec)
ERROR:
No query specified
刪除 username
mysql> ALTER TABLE users2 DROP INDEX username;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM users2;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| username | varchar(10) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| id | smallint(5) unsigned | NO | | 0 | |
| age | tinyint(3) unsigned | NO | | NULL | |
+----------+----------------------+------+-----+---------+-------+
4 rows in set (0.02 sec)
顯示 索引,發現username確實不見了。
mysql> SHOW INDEXES FROM users2\G;
*************************** 1. row ***************************
Table: users2
Non_unique: 1
Key_name: pid
Seq_in_index: 1
Column_name: pid
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
ERROR:
No query specified
刪除外來鍵約束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
mysql> SHOW CREATE TABLE users2;
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
| Table | Create Table
|
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
| users2 | CREATE TABLE `users2` (
`username` varchar(10) NOT NULL,
`pid` smallint(5) unsigned DEFAULT NULL,
`id` smallint(5) unsigned NOT NULL DEFAULT '0',
`age` tinyint(3) unsigned NOT NULL,
KEY `pid` (`pid`),
CONSTRAINT `users2_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
1 row in set (0.00 sec)
users2_ibfk_1是上表已經告訴我們的內容,直接拿來用就行
刪除外來鍵約束:
mysql> ALTER TABLE users2 DROP FOREIGN KEY users2_ibfk_1;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE users2;
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
| Table | Create Table
|
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
| users2 | CREATE TABLE `users2` (
`username` varchar(10) NOT NULL,
`pid` smallint(5) unsigned DEFAULT NULL,
`id` smallint(5) unsigned NOT NULL DEFAULT '0',
`age` tinyint(3) unsigned NOT NULL,
KEY `pid` (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------+
1 row in set (0.00 sec)
mysql> ALTER TABLE users2 DROP INDEX pid;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE users2;
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
-----------------------------------------------------------------------------+
| Table | Create Table
|
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
-----------------------------------------------------------------------------+
| users2 | CREATE TABLE `users2` (
`username` varchar(10) NOT NULL,
`pid` smallint(5) unsigned DEFAULT NULL,
`id` smallint(5) unsigned NOT NULL DEFAULT '0',
`age` tinyint(3) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+----------------------------------------------------------------------
--------------------------------------------------------------------------------
-----------------------------------------------------------------------------+
1 row in set (0.00 sec)
3.7 結束
3-8 MySQL 修改資料表--修改列定義和更名資料表
修改列定義:
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
移動id到第一行:
mysql> ALTER TABLE users2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
顯示移動的效果:
mysql> SHOW COLUMNS FROM users2;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| id | smallint(5) unsigned | NO | | NULL | |
| username | varchar(10) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | | NULL | |
| age | tinyint(3) unsigned | NO | | NULL | |
+----------+----------------------+------+-----+---------+-------+
4 rows in set (0.03 sec)
修改id的型別為TINYINT程式碼:
mysql> ALTER TABLE users2 MODIFY id TINYINT UNSIGNED NOT NULL;
由大型別轉為小型別,可能造成資料丟失,因為儲存範圍會縮小。
修改列名稱:
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new _col_name column_definition [FIRST | AFTER col_name]
pid名字改為p_id
mysql> ALTER TABLE users2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;
資料表更名:
方法1:
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
方法2:
RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2]...
修改users2名字為users3程式碼:
mysql> ALTER TABLE users2 RENAME users3;
Query OK, 0 rows affected (0.03 sec)
檢視資料庫test裡面所有的table,發現users2確實不見了。
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| provinces |
| tb1 |
| tb2 |
| tb3 |
| tb4 |
| tb5 |
| tb6 |
| users1 |
| users3 |
+----------------+
9 rows in set (0.00 sec)
把users3又更名回來users2程式碼:
mysql> RENAME TABLE users3 TO users2;
注意:儘可能少使用資料列和資料表的更名。
3.8總結
約束:
按照功能劃分為:
NOT NULL, PRIMARY KEY, UNIQUE KEY, DEFAULT, FOREIGN KEY
按照資料列的數目化為:
表級約束和列級約束
修改資料表:
針對欄位的操作:新增,刪除欄位,修改列定義,修改列名稱等。
針對約束的操作:新增刪除各種約束
針對資料表的操作:資料表更名的兩種方式
3-9 小結
4-1 回顧和概述
4-2 MySQL 插入記錄INSERT
插入記錄
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr|DEFAULT},...),(...),...
建立一個表users程式碼:
mysql> CREATE TABLE users(
->
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(20) NOT NULL,
-> password VARCHAR(20) NOT NULL,
-> age TINYINT UNSIGNED NOT NULL DEFAULT 10,
-> sex BOOLEAN
-> );
Query OK, 0 rows affected (0.03 sec)
插入一個值程式碼:
mysql> INSERT users VALUES(NULL, 'Tom', '123', 25, 1);
顯示剛才輸入的內容,程式碼:
mysql> SELECT * FROM users;
+----+----------+----------+-----+------+
| id | username | password | age | sex |
+----+----------+----------+-----+------+
| 1 | Tom | 123 | 25 | 1 |
+----+----------+----------+-----+------+
1 row in set (0.00 sec)
mysql> INSERT users VALUES(NULL, 'John', '456', 25, 1);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT users VALUES(DEFAULT, 'John', '456', 25, 1);
Query OK, 1 row affected (0.01 sec)
可以用表示式:3*7+4
mysql> INSERT users VALUES(DEFAULT, 'John', '456', 3*7+4, 1);
Query OK, 1 row affected (0.01 sec)
預設值:
mysql> INSERT users VALUES(DEFAULT, 'John', '456', DEFAULT, 1);
該方法還可以一次性插入多條記錄:
mysql> INSERT users VALUES(DEFAULT, 'John', '456', DEFAULT, 1),(NULL, 'John', '456', 25, 1);
4-3 MySQL 插入記錄INSERT SET-SELECT
插入記錄
INSERT [INTO] tbl_name SET col_name = {expr | DEFAULT}, ...
這種方法可以使用子查詢(subquery)
由比較運算子引發的子查詢。
這種方法一次只能插入一條記錄,
mysql> INSERT users SET username = 'Ben', password = '456';
插入記錄
INSERT [INTO] tbl_name [(col_name,...)] SELECT...
這種方法可以把查詢結果插入到指定資料表中
4-4 MySQL 單表更新記錄UPDATE
更新記錄(單表更新)
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}]...[where where_condition]
讓表中所有年齡都加上5歲,程式碼:
mysql> UPDATE users set age = age + 5;
Query OK, 6 rows affected (0.01 sec)
Rows matched: 6 Changed: 6 Warnings: 0
更改所有年齡減去前面的序號,更改性別為1,程式碼:
mysql> UPDATE users SET age = age - id, sex = 0;
更新年齡加上10歲,當取餘數為0才執行的程式碼:
mysql> UPDATE users SET age = age + 10 WHERE id % 2 =0;
4-5 MySQL 單表刪除記錄DELETE
刪除記錄:(單標刪除)
DELETE FROM tbl_name [WHERE where_condition]
刪除第六條記錄程式碼:
mysql> DELETE FROM users WHERE id = 6;
插入一條記錄,id號碼到底為什麼?程式碼:
mysql> INSERT users VALUES(null, '111','222',33,NULL);
Query OK, 1 row affected (0.01 sec)
發現程式碼號在原來的基礎上加1了