首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 進階核心:第 21-29 章精華(表操作、視圖、存儲過程、游標、觸發器、事務、全球化、安全、維護)

     編輯:MySQL 綜合教學

第 21 章:表的創建、修改與刪除

21.1 CREATE TABLE 要點

CREATE TABLE customers (
  cust_id       INT NOT NULL AUTO_INCREMENT,
  cust_name     CHAR(50) NOT NULL,
  cust_address  CHAR(50) NULL,
  cust_city     CHAR(50) NULL,
  cust_state    CHAR(5)  NULL,
  cust_zip      CHAR(10) NULL,
  cust_country  CHAR(50) NULL,
  cust_contact  CHAR(50) NULL,
  cust_email    CHAR(255) NULL,
  PRIMARY KEY (cust_id)
) ENGINE = InnoDB;
  • 複合主鍵:PRIMARY KEY (order_num, order_item);
  • AUTO_INCREMENT:每表僅一列,SELECT LAST_INSERT_ID() 獲取;
  • DEFAULT:指定列默認值;
  • 引擎選擇:InnoDB(事務)、MyISAM(全文搜索、高性能)、MEMORY(臨時表、極速),外鍵不能跨引擎。

21.2 ALTER TABLE 常用操作

ALTER TABLE vendors ADD vend_phone CHAR(20);      -- 增加列
ALTER TABLE vendors DROP vend_phone;              -- 刪除列
ALTER TABLE orderitems ADD CONSTRAINT fk_oi_o
  FOREIGN KEY (order_num) REFERENCES orders(order_num); -- 添加外鍵

21.3 DROP / RENAME

DROP TABLE customers;
RENAME TABLE backup_customers TO customers;

第 22 章:視圖

視圖是虛擬表,不存儲數據,僅保存 SELECT 查詢。每次使用時動態執行。

核心操作

CREATE VIEW productcustomers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
  AND orderitems.order_num = orders.order_num;

-- 使用視圖簡化查詢
SELECT cust_name, cust_contact FROM productcustomers WHERE prod_id = 'TNT2';

-- 刪除/重建
DROP VIEW viewname;
CREATE OR REPLACE VIEW viewname AS ...;

可更新視圖限制

含以下構造的視圖不可更新:GROUP BY/HAVING、JOIN、子查詢、UNION、聚集函數、DISTINCT、導出列。


第 23 章:存儲過程

將一組 SQL 封裝為單一單元,優勢:簡單、安全、高性能(減少網絡往返、編譯緩存)。

23.1 創建與調用

DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
  SELECT AVG(prod_price) AS priceaverage FROM products;
END//
DELIMITER ;

CALL productpricing();

DELIMITER 臨時更改語句結束符,避免過程體內 ; 被誤判。

23.2 參數模式

模式關鍵字方向
輸入IN調用者 → 過程
輸出OUT過程 → 調用者
雙向INOUT雙向
CREATE PROCEDURE ordertotal(
  IN onumber INT,
  IN taxable BOOLEAN,
  OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding tax'
BEGIN
  DECLARE total DECIMAL(8,2) DEFAULT 0;
  DECLARE taxrate INT DEFAULT 6;

  SELECT SUM(item_price*quantity) INTO total
  FROM orderitems WHERE order_num = onumber;

  IF taxable THEN
    SET total = total + (total/100*taxrate);
  END IF;

  SELECT total INTO ototal;
END;

23.3 管理命令

DROP PROCEDURE IF EXISTS productpricing;
SHOW CREATE PROCEDURE ordertotal;
SHOW PROCEDURE STATUS LIKE 'ordertotal';

第 24 章:游標

游標是服務端結果集指針,支援逐行處理,僅能在存儲過程/函數/觸發器中使用。

四步驟

  1. DECLARE cursor_name CURSOR FOR SELECT ...(不取數據);
  2. OPEN cursor_name(執行查詢、構建結果集);
  3. FETCH cursor_name INTO var1, var2 ...(取行、移動指針);
  4. CLOSE cursor_name(釋放資源)。

完整範例:批量計算訂單含稅總額

CREATE PROCEDURE processorders()
BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE o INT;
  DECLARE t DECIMAL(8,2);

  DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  CREATE TABLE IF NOT EXISTS ordertotals (order_num INT, total DECIMAL(8,2));

  OPEN ordernumbers;
  REPEAT
    FETCH ordernumbers INTO o;
    IF NOT done THEN
      CALL ordertotal(o, 1, t);  -- 調用前章帶稅過程
      INSERT INTO ordertotals VALUES (o, t);
    END IF;
  UNTIL done END REPEAT;
  CLOSE ordernumbers;
END;

第 25 章:觸發器

響應 INSERT/UPDATE/DELETE 自動執行。每表每事件每時機僅一個觸發器,最多 6 個。

創建語法

CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT 'Product added';

虛擬表 NEW / OLD

觸發器類型可用虛擬表NEW 可寫?OLD 可寫?
INSERTNEWBEFORE 可寫無
DELETEOLD無只讀
UPDATENEW, OLDBEFORE 可寫只讀

實用範例:刪除前歸檔

CREATE TRIGGER deleteorder BEFORE DELETE ON orders
FOR EACH ROW
BEGIN
  INSERT INTO archive_orders (order_num, order_date, cust_id)
  VALUES (OLD.order_num, OLD.order_date, OLD.cust_id);
END;

第 26 章:事務處理

保證一組操作全成功或全失敗(ACID)。

核心命令

START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;  -- 或 ROLLBACK;

保存點

SAVEPOINT delete1;
-- ...操作...
ROLLBACK TO delete1;  -- 部分回滾

自動提交控制

SET autocommit = 0;  -- 關閉隱式提交,需顯式 COMMIT

第 27 章:全球化與本地化

CREATE TABLE mytable (
  col1 INT,
  col2 VARCHAR(100)
) DEFAULT CHARACTER SET hebrew COLLATE hebrew_general_ci;

SHOW CHARACTER SET;  -- 查看支援字符集
SHOW COLLATION;      -- 查看支援校對規則

第 28 章:安全管理

用戶生命周期

CREATE USER ben IDENTIFIED BY 'P@$$w0rd';
RENAME USER ben TO bforta;
DROP USER bforta;

權限控制

GRANT SELECT ON crashcourse.* TO bforta;
SHOW GRANTS FOR bforta;
REVOKE SELECT ON crashcourse.* FROM bforta;

修改密碼

SET PASSWORD FOR bforta = PASSWORD('n3wp@$$w0rd');
SET PASSWORD = PASSWORD('n3wp@$$w0rd');  -- 當前用戶

第 29 章:數據庫維護

ANALYZE TABLE tbl_name;   -- 檢查鍵分佈統計
CHECK TABLE tbl_name;     -- 多維度完整性檢查
REPAIR TABLE tbl_name;    -- 修復損壞表(MyISAM)
OPTIMIZE TABLE tbl_name;  -- 整理碎片、回收空間
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved