之前介紹了資料庫的增刪改查, 發現忘記了資料庫的一些基本操作, 比如建庫, 建表, 改表等等. 那這裡就來小結一下資料庫sql形式的基本操作. 一、庫操作 1. 建庫 在建庫之前, 可能需要看一下, 資料庫裡面, 已經存在哪些庫, 這樣可以去處理重覆的問題. 這裡之所以會出現newdb, 是因為我已 ...
之前介紹了資料庫的增刪改查, 發現忘記了資料庫的一些基本操作, 比如建庫, 建表, 改表等等. 那這裡就來小結一下資料庫sql形式的基本操作.
一、庫操作
1. 建庫
在建庫之前, 可能需要看一下, 資料庫裡面, 已經存在哪些庫, 這樣可以去處理重覆的問題.
show databases;
這裡之所以會出現newdb, 是因為我已經執行過下麵的創建庫的腳本了.
然後, 就可以創建庫了.
create DATABASE newdb;
執行這句話, 就會按照預設編碼的方式去創建資料庫newdb. 那預設編碼是什麼呢, 來看一下:
show create database newdb;
如果想要在創建庫的時候, 就指定好編碼格式的話, 那麼只需要按照上面這種模式去加就好了
create database newdb2 default character set utf8
其實編碼不用管, 使用預設的方式就好.
2. 刪庫 -- 慎用
drop database newdb;
3. 引用庫
如果你在1號庫中, 想查詢2號庫的表, 那麼就需要使用到這個
use test;
二、表操作
1. 建表
同樣的, 建表之前, 要查詢表中是否已存在我們想見的表.
show tables;
如果沒有, 則可以開始新建表了, 如果庫裡面已經有了表模板, 並且你想在新建的時候, 導入部分數據, 那麼應該使用下麵這種方法:
create table tch_contact2 select * from tch_contact;
這樣的話, tch_contact2能獲取tch_contact的結構和數據, 但是並不能獲取別的, 例如:索引, 外鍵, 觸發器.
另外一種建表, 則稍微有點複雜
CREATE TABLE `contact` ( `Id` int(11) NOT NULL AUTO_INCREMENT, -- 不為空, 自動增長 `TId` int(11) DEFAULT NULL, `QQ` varchar(15) DEFAULT NULL, `Weixin` varchar(50) DEFAULT NULL, `Phone` varchar(15) DEFAULT NULL, PRIMARY KEY (`Id`), -- 設置主鍵 KEY `Index_TId` (`TId`) USING BTREE, -- 索引 CONSTRAINT `key_tid` FOREIGN KEY (`TId`) REFERENCES `tch_teacher` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION -- 設置外鍵 ) COMMENT='就是這個表' -- 表註釋
有時候需要用到臨時表, 方法也很簡單, 只需要在create table 中間加上一句 TEMPORARY 就可以了, 其他的, 都是和一般建表一樣:
create temporary table '表名'()
1.1 設置主鍵
設置主鍵的語句, 可以分開寫, 也可以合在一起寫.
`Id` int(11) NOT NULL PRIMARY key AUTO_INCREMENT, -- 或者 `Id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`Id`),
1.2 設置索引 -- 索引這裡有單個索引和複合索引, 但是設置方法都是一樣的
mysql裡面, 索引有三種類型, Normal, Unique, FullText. 索引方法由兩種: Btree, Hash
-- 單個索引 KEY `Index_Weixin` (`Weixin`) USING BTREE, UNIQUE KEY `Index_TId` (`TId`) USING HASH, FULLTEXT KEY `Index_QQ` (`QQ`), -- 複合索引 KEY `Index_fuhe` ('QQ', `Weixin`) USING BTREE,
我一般都只用Normal, Btree兩個, 單個的和符合的都用.
1.3 外鍵
CONSTRAINT `key_tid` FOREIGN KEY (`TId`) REFERENCES `tch_teacher` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION
著句話, 看著可能有點費解, 但是看一下軟體中的界面, 就非常清楚了
別的不需要解釋了, 但是這裡有個刪除時, 更新時, 還是需要嘮叨兩句.
mysql這裡, 有四個值可供選擇.
RESTRICT -- 限制, 此限制是在更新之前.
在刪除tch_teacher數據時, 如果tch_contact還有與之對應的值, 則刪除失敗
NO ACTION -- 限制, 此限制是在更新之後. 與Restrict觸發的時間不同, 但是功能是一樣的.
CASCADE -- 級聯, 不限制刪除, 但是會同步修改或刪除.
如果tch_teacher刪除一條數據, 那麼tch_contact會同步刪除, 與他關聯的數據.
修改也是一樣, 會同步修改.
SET NULL -- 設置為空, 如果tch_teacher刪除一條數據, 那麼tch_contact會將與之關聯的那個欄位設置為null, 不是把整條數據, 只是那個欄位.
這裡, 我覺得比較實用的就是 cascade了, 同步刪除功能, 省下我不少工作呢.
2. 表操作
表操作又分為表結構修改和表名稱修改. 先看表結構.
建好表之後, 發現其中的列, 並不完全是我想要的, 那咋搞呢?
2.1 查詢列
show COLUMNS from tch_contact;
2.2 加列
alter table tch_contact add createby int comment '創建人';
2.3 修改列
alter table tch_contact MODIFY createby varchar(1);
2.4 減列
alter table tch_contact drop createby;
2.5 索引
-- 新增一個索引 create index index_tid on tch_contact2(tid) using BTREE; alter table tch_contact2 add index index_weixin(weixin); -- 如果要修改一個索引, mysql裡面, 只有先刪除然後重建 -- 刪除一個索引 drop index index_tid on tch_contact2;
2.6 外鍵
-- 新增一個外鍵 alter table tch_contact2 add CONSTRAINT `key_tid` FOREIGN KEY (`TId`) REFERENCES `tch_teacher` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION; -- 刪除一個外鍵 alter table tch_contact2 DROP FOREIGN KEY key_tid ;
2.7 表名稱修改
rename table tch_contact to tch_contact1; ALTER TABLE tch_contact1 RENAME tch_contact;
這兩句都是表名稱修改的語句.
3. 表刪除 -- 慎用
drop table tch_contactt;
項目中最常用的, 其實也就是上面這些了.