mysql> help create index Name: 'CREATE INDEX' Description: Syntax: CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option] ..UNIQUE:唯一索引(用戶表的ID,手機號等,唯一信息) SPATIAL:地理位置索引(搜索周邊有哪些人) 兩種創建索引及查看表中索引的方法
mysql> select * from vc; +------+------+ | v | c | +------+------+ | AB | AB | +------+------+ 1 row in set (0.00 sec) mysql> create index idx_v on vc(v); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table vc add KEY idx_c (c); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from vc; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | vc | 1 | idx_v | 1 | v | A | 1 | NULL | NULL | YES | BTREE | | | | vc | 1 | idx_c | 1 | c | A | 1 | NULL | NULL | YES | BTREE | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec) mysql> show create table vc; +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | vc | CREATE TABLE `vc` ( `v` varchar(5) DEFAULT NULL, `c` char(5) DEFAULT NULL, KEY `idx_v` (`v`), KEY `idx_c` (`c`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)在mysql中 INDEX 和KEY 都代表了索引; 約束
索引有哪些:
mysql> alter table order add primary key (id) #實際上是給主鍵id增加了一個索引,而這個索引又是唯一的所以就這個索引就變成了唯一約束添加唯一索引:
mysql>alter table order add unique key idx_uk_orderid(id)外鍵約束 將兩張表的數據通過某種條件關聯起來 例子:買東西,訂單表,用戶信息表; 如果沒有外鍵約束:可能存在不存在用戶也能下單成功; 而如果使用外鍵約束,則在數據庫層面是的不存在的用戶不能下單成功。 創建外鍵約束: 將用戶表和訂單表通過外鍵關聯起來:
mysql > alter table order add CONSTRAINT constarint_uid FOREIGN KEY (userid) REFERENCES user(userid)創建外鍵約束的時候,可以指定在刪除,更新父表(被參照的表)時,對子表(做外鍵關聯的表) 進行的相應操作,包括可:restrict(限制),cascade(串聯),set null 和 no action。 其中restrict和 no action 相同,是指限制在子表有關聯記錄的情況下,父表不能更新; cascade表示父表在更新或刪除時,更新或者刪除子表對應的記錄; set null 表示父表在更新或者刪除時子表的對應字段被set null。 選擇後兩種方式的時候要謹慎,可能會因為錯誤的操作導致數據的丟失。 在執行LOAD DATA和 ALTER TABLE 操作的時候,為了加快速度,可以暫時關閉外鍵約束: set foreign key_checks =0;等完成之後再開啟:set foreign key_checks =1
mysql > alter table order add CONSTRAINT constarint_uid FOREIGN KEY (userid) REFERENCES user(userid) on delete restrict on update cascade;on update cascade例子:
mysql> select * from c_A; +----+------+ | id | age | +----+------+ | 1 | 22 | | 2 | 3 | | 3 | 4 | +----+------+ 3 rows in set (0.00 sec) mysql> select * from c_B; +----+------+ | id | age | +----+------+ | 1 | 2 | | 2 | 33 | | 3 | 4 | +----+------+ 3 rows in set (0.00 sec) mysql> update c_B set id=11 where age = 2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from c_B; +----+------+ | id | age | +----+------+ | 2 | 33 | | 3 | 4 | | 11 | 2 | +----+------+ 3 rows in set (0.00 sec) mysql> select * from c_A; +----+------+ | id | age | +----+------+ | 2 | 3 | | 3 | 4 | | 11 | 22 | +----+------+ 3 rows in set (0.00 sec)注意:外鍵約束更改的只是約束的那個字段; on delete cascade on delete cascade insert update delete parent yes 只能更改子表中約束字段沒有的值 yes child 只能插入父表中約束字段有的值; 只能更改父表中約束字段沒有的值 yes on update cascade on update cascade insert update delete parent yes yes 只能刪子表中約束字段沒有的值; child 只能插入父表中約束字段有的值; 只能更新父表中約束字段沒有的值 yes 可以見child只能刪除,其余都受限余父表的約束字段; 而parent都能插入,但其中一條受限於子表約束字段; 給order表增加了一個約束,(CONSTRAINT,約束的關鍵詞)約束名 constarint_uid; 他是一個外鍵約束且order表中userid是外鍵,把order表中的userid 關聯 到 user表的userid; 使用外鍵的注意事項:
mysql> alter table order drop FOREIGN KEY constarint_uid;
視圖view
mysql > create view order_view as select * from order where status = 1視圖例子:
mysql> CREATE TABLE t (qty INT, price INT); mysql> INSERT INTO t VALUES(3, 50); mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t; mysql> SELECT * FROM v; +------+-------+-------+ | qty | price | value | +------+-------+-------+ | 3 | 50 | 150 | +------+-------+-------+
觸發器
CREATE [DEFINER = {user | CURRENT_USER}] -- 定義執行著的權限 TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW --涉及的每一行都會執行trigger_body trigger_body t trigger_time:{BEFORE | AFTER} trigger_event:{INSERT | UPDATE | DELETE}delimiter 結束符的設定,默認是分號。但是在觸發器應為要執行一組SQL,會出現分號所以講結束符 設定一下;
用 NEW,OLD來引用觸發器中發生變化的記錄內容 觸發觸發器的順序: before 觸發器,行操作,after 觸發器;其中任何一個步驟操作發生錯誤都不會繼續執行剩下的操作。 如果是對事務表進行的操作,那麼會整個作為一個事務被回滾(rollback),但是如果是對非事務表進行的操作 ,那麼已經更新的記錄將無法回滾,這也是設計觸發器的時候需要注意得問題。 觸發器的特點:
CREATE [ DEFINER = { user | CURRENT_USER } ] --定義執行著的權限 PROCEDURE sp_name ( [ proc_parameter[ ,... ] ] ) [ characteristic .. ] routine_body proc_parameter: [ IN | OUT | INOUT] param_name type type: Any valid MySQL data type
IN:輸入參數,表示該參數值在調用存儲過程中已經指定好了,在調用存儲過程中修改該參數不會返回 OUT:輸出參數,可以在存儲過程內部被改變,可以返回 INOUT:輸入輸出參數; characteristic: COMMENT 'string' --注釋 | [NOT] DETERMINISTIC --是否會返回確定值 routine_body: Valid SQL routine statement --與trigger類似
重點:
mysql> show PROCEDURE STATUS ;查看:某個觸發器的詳情
mysql> SHOW TRIGGER STATUS ;
存儲過程的使用: 1.設置參數值:
mysql> set @total = 5; mysql> set @res = 0;2.調用存儲過程:
mysql> call proc_test1(@total,@res);3.查看返回值:
mysql> select @res刪除存儲過程或者函數:
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name查看存儲過程或者函數 SHOW {procedure | function} status like ‘file_in_stock’ 查看存儲過程或者函數的定義 show create {procedure | function} sp_name 存儲過程-流控制語言
自定義函數
mysql> select func_test1(4);確認權限: 創建存儲過程或者函數需要:create routine 修改或者刪除存儲過程需要:alter routine 執行存儲過程 需要 : execute 可以嵌套使用; 小結