欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL數(shù)據(jù)類型與表操作全指南(?從基礎(chǔ)到高級實(shí)踐)

 更新時(shí)間:2025年08月08日 16:18:16   作者:搬磚的碼農(nóng)  
本文詳解MySQL數(shù)據(jù)類型分類(數(shù)值、日期/時(shí)間、字符串)及表操作(創(chuàng)建、修改、維護(hù)),涵蓋優(yōu)化技巧如數(shù)據(jù)類型選擇、備份、分區(qū),強(qiáng)調(diào)規(guī)范設(shè)計(jì)與實(shí)際應(yīng)用結(jié)合,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

MySQL數(shù)據(jù)類型詳解

MySQL支持多種數(shù)據(jù)類型,主要分為三類:數(shù)值類型、日期/時(shí)間類型和字符串類型。

數(shù)值類型

數(shù)值類型用于存儲數(shù)字,包括整數(shù)和浮點(diǎn)數(shù):

類型大小(字節(jié))范圍(有符號)說明
TINYINT1-128 到 127小整數(shù)值
INT4-2147483648 到 2147483647標(biāo)準(zhǔn)整數(shù)
BIGINT8±9.22e18大整數(shù)
FLOAT4-3.402823466E+38 到 3.402823466E+38單精度浮點(diǎn)數(shù)
DOUBLE8±1.7976931348623157E+308雙精度浮點(diǎn)數(shù)
DECIMAL(M,D)變長取決于M和D精確小數(shù),M總位數(shù),D小數(shù)位

示例:

CREATE TABLE products (
    id INT PRIMARY KEY,
    price DECIMAL(10,2), -- 總10位,含2位小數(shù)
    quantity SMALLINT UNSIGNED -- 無符號小整數(shù)
);

日期時(shí)間類型

日期和時(shí)間類型用于存儲時(shí)間信息:

類型格式范圍說明
DATEYYYY-MM-DD1000-01-01 到 9999-12-31日期值
TIMEHH:MM:SS-838:59:59 到 838:59:59時(shí)間值
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 到 9999-12-31 23:59:59混合日期時(shí)間
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 到 2038-01-19 03:14:07時(shí)間戳,自動更新
YEARYYYY1901 到 2155年份值

字符串類型

字符串類型用于存儲文本和二進(jìn)制數(shù)據(jù):

類型最大長度說明
CHAR(n)255字符定長字符串,空格填充
VARCHAR(n)65,535字符變長字符串,節(jié)省空間
TEXT65,535字符長文本數(shù)據(jù)
BLOB65,535字節(jié)二進(jìn)制大對象
ENUM65,535項(xiàng)枚舉類型,值從預(yù)定義列表中選擇
SET64個(gè)成員集合類型,允許選擇多個(gè)預(yù)定義值

示例:

CREATE TABLE users (
    username VARCHAR(50) NOT NULL,
    gender ENUM('Male','Female','Other'),
    interests SET('Music','Sports','Reading')
);

表操作全解析

創(chuàng)建表

基本語法:

CREATE TABLE table_name (
    column1 datatype constraints,
    column2 datatype constraints,
    ...
    PRIMARY KEY (one_or_more_columns)
);

完整示例:

CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT,
    first_name VARCHAR(20) NOT NULL,
    last_name VARCHAR(20) NOT NULL,
    birth_date DATE,
    hire_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    salary DECIMAL(10,2) CHECK (salary > 0),
    PRIMARY KEY (emp_id),
    UNIQUE (first_name, last_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

修改表結(jié)構(gòu)

添加列

ALTER TABLE employees
ADD COLUMN email VARCHAR(100) AFTER last_name;

修改列

-- 修改數(shù)據(jù)類型
ALTER TABLE employees
MODIFY COLUMN salary DECIMAL(12,2);
-- 重命名列
ALTER TABLE employees
CHANGE COLUMN birth_date date_of_birth DATE;

刪除列

ALTER TABLE employees
DROP COLUMN hire_date;

約束管理

添加主鍵

ALTER TABLE orders
ADD PRIMARY KEY (order_id);

添加外鍵

ALTER TABLE order_items
ADD CONSTRAINT fk_order
FOREIGN KEY (order_id) REFERENCES orders(order_id)
ON DELETE CASCADE;

添加唯一約束

ALTER TABLE users
ADD UNIQUE (email);

表維護(hù)操作

重命名表

RENAME TABLE old_name TO new_name;
-- 或
ALTER TABLE old_name RENAME TO new_name;

截?cái)啾?/h3>
TRUNCATE TABLE log_entries; -- 快速刪除所有數(shù)據(jù)

刪除表

DROP TABLE IF EXISTS temp_data;

表優(yōu)化技巧

  • 選擇合適的數(shù)據(jù)類型
    • 用INT代替VARCHAR存儲數(shù)字
    • 用DATE代替DATETIME如果不需要時(shí)間部分
    • 用ENUM代替VARCHAR存儲固定選項(xiàng)
  • 規(guī)范命名約定
CREATE TABLE customer_orders (  -- 使用蛇形命名法
    order_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    customer_id INT UNSIGNED NOT NULL,
    order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (order_id)
);

使用注釋增強(qiáng)可讀性

CREATE TABLE payments (
    payment_id INT COMMENT '主鍵ID',
    amount DECIMAL(10,2) COMMENT '支付金額',
    payment_method ENUM('Credit','Paypal','Bank') 
        COMMENT '支付方式'
) COMMENT='支付信息表';

分區(qū)大表優(yōu)化查詢

CREATE TABLE sensor_data (
    id INT AUTO_INCREMENT,
    sensor_id INT,
    reading_time TIMESTAMP,
    value FLOAT,
    PRIMARY KEY (id, reading_time)
) PARTITION BY RANGE (YEAR(reading_time)) (
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023)
);

最佳實(shí)踐與注意事項(xiàng)

備份優(yōu)先原則 執(zhí)行結(jié)構(gòu)變更前務(wù)必備份:

mysqldump -u root -p database_name > backup.sql
  • 外鍵約束影響
    • ON DELETE CASCADE:刪除主表記錄時(shí)自動刪除從表相關(guān)記錄
    • ON DELETE SET NULL:將外鍵設(shè)為NULL
    • 謹(jǐn)慎使用CASCADE避免誤刪連鎖反應(yīng)
  • 字符集選擇
    • 推薦utf8mb4支持所有Unicode字符(包括emoji)
    • 校對規(guī)則:utf8mb4_unicode_ci(大小寫不敏感)
  • 存儲引擎選擇
SHOW ENGINES; -- 查看支持的引擎
  • InnoDB:支持事務(wù)、行級鎖(默認(rèn))
  • MyISAM:全文索引,但不支持事務(wù)
  • Memory:數(shù)據(jù)存儲在內(nèi)存中
  • 性能優(yōu)化
    • 避免過度使用ENUM(修改值需重建表)
    • TEXT/BLOB列單獨(dú)存到副表
    • 定期分析表優(yōu)化存儲:
ANALYZE TABLE orders;
OPTIMIZE TABLE log_data;

實(shí)戰(zhàn)案例:電商系統(tǒng)表設(shè)計(jì)

-- 商品表
CREATE TABLE products (
    product_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    description TEXT,
    price DECIMAL(10,2) UNSIGNED NOT NULL,
    stock INT UNSIGNED DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_name (name)
) ENGINE=InnoDB;
-- 訂單表
CREATE TABLE orders (
    order_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_id INT UNSIGNED NOT NULL,
    total_amount DECIMAL(12,2) NOT NULL,
    status ENUM('Pending','Paid','Shipped','Completed') DEFAULT 'Pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_user
        FOREIGN KEY (user_id) REFERENCES users(user_id)
        ON DELETE RESTRICT
) PARTITION BY HASH(order_id) PARTITIONS 4;
-- 訂單明細(xì)表
CREATE TABLE order_details (
    detail_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_id BIGINT UNSIGNED NOT NULL,
    product_id INT UNSIGNED NOT NULL,
    quantity SMALLINT UNSIGNED NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    CONSTRAINT fk_order
        FOREIGN KEY (order_id) REFERENCES orders(order_id)
        ON DELETE CASCADE,
    CONSTRAINT fk_product
        FOREIGN KEY (product_id) REFERENCES products(product_id)
        ON DELETE RESTRICT
);

常見問題解決方案

問題1:如何修改AUTO_INCREMENT起始值?

ALTER TABLE products AUTO_INCREMENT = 1000;

問題2:誤刪表如何恢復(fù)?

  • 使用備份文件恢復(fù)
  • 若無備份,嘗試從binlog恢復(fù):
mysqlbinlog --start-datetime="2023-01-01 00:00:00" binlog.000001 | mysql -u root -p

問題3:大表添加列卡頓 使用pt-online-schema-change工具在線修改:

pt-online-schema-change --alter "ADD COLUMN new_col INT" D=database,t=table --execute

問題4:存儲引擎轉(zhuǎn)換

ALTER TABLE orders ENGINE = InnoDB; -- 轉(zhuǎn)換為InnoDB

進(jìn)階技巧

生成列(Generated Columns)

CREATE TABLE invoices (
    subtotal DECIMAL(10,2),
    tax_rate DECIMAL(5,4),
    tax_amount DECIMAL(10,2) AS (subtotal * tax_rate) STORED,
    total DECIMAL(10,2) AS (subtotal + tax_amount) STORED
);

JSON數(shù)據(jù)類型操作

CREATE TABLE product_specs (
    product_id INT PRIMARY KEY,
    specs JSON
);
INSERT INTO product_specs VALUES (1, '{"color": "red", "weight": 500}');
SELECT specs->>"$.color" FROM product_specs;

表空間管理

-- 創(chuàng)建獨(dú)立表空間
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' ENGINE=InnoDB;
CREATE TABLE large_table (
    id INT PRIMARY KEY
) TABLESPACE ts1;

不可見列(MySQL 8.0+)

CREATE TABLE accounts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    balance DECIMAL(10,2) INVISIBLE
);
INSERT INTO accounts (id) VALUES (1); -- 必須顯式指定可見列
SELECT * FROM accounts; -- 不顯示balance列
SELECT id, balance FROM accounts; -- 顯式查詢

通過深入理解MySQL數(shù)據(jù)類型和表操作,可以設(shè)計(jì)出高效可靠的數(shù)據(jù)庫結(jié)構(gòu)。實(shí)際應(yīng)用中需結(jié)合業(yè)務(wù)場景選擇合適的數(shù)據(jù)類型,遵循數(shù)據(jù)庫設(shè)計(jì)規(guī)范,并定期進(jìn)行表結(jié)構(gòu)優(yōu)化維護(hù)。

到此這篇關(guān)于MySQL數(shù)據(jù)類型從基礎(chǔ)到高級實(shí)踐與表操作全指南的文章就介紹到這了,更多相關(guān)mysql數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql Access denied for user ‘root’@’localhost’ (using password: YES)解決方法

    mysql Access denied for user ‘root’@’localhost’ (using passw

    這篇文章主要介紹了mysql Access denied for user ‘root’@’localhost’ (using password: YES)解決方法,本文給出詳細(xì)的解決步驟及操作注釋,需要的朋友可以參考下
    2015-07-07
  • 在MySQL中使用STRAIGHT_JOIN的教程

    在MySQL中使用STRAIGHT_JOIN的教程

    這篇文章主要介紹了在MySQL中使用STRAIGHT_JOIN的教程,包括使用STRAIGHT_JOIN進(jìn)行一些性能上的優(yōu)化的技巧,需要的朋友可以參考下
    2015-05-05
  • MySQL數(shù)據(jù)庫超時(shí)設(shè)置配置的方法實(shí)例

    MySQL數(shù)據(jù)庫超時(shí)設(shè)置配置的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫超時(shí)設(shè)置配置的相關(guān)資料,通過文中的設(shè)置方法可以很好的解決大家遇到的mysql數(shù)據(jù)庫超時(shí)問題,需要的朋友可以參考下
    2021-10-10
  • mysql 的replace into實(shí)例詳解

    mysql 的replace into實(shí)例詳解

    這篇文章主要介紹了mysql 的replace into實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • MySQL查找NULL值的全面指南

    MySQL查找NULL值的全面指南

    在數(shù)據(jù)庫中,NULL 值表示缺失或未知的數(shù)據(jù),在 MySQL 中,我們可以使用特定的查詢語句來查找包含 NULL 值的數(shù)據(jù),本文將詳細(xì)介紹如何在 MySQL 中查找 NULL 值,并提供相關(guān)實(shí)例和代碼片段,需要的朋友可以參考下
    2024-05-05
  • 詳解MySQL8中的新特性窗口函數(shù)

    詳解MySQL8中的新特性窗口函數(shù)

    MySQL8?窗口函數(shù)是一種特殊的函數(shù),它可以在一組查詢行上執(zhí)行類似于聚合的操作,但是不會將查詢行折疊為單個(gè)輸出行,而是為每個(gè)查詢行生成一個(gè)結(jié)果,本文就來和大家簡單講講它的用法,感興趣的可以了解一下
    2023-06-06
  • Mysql中zerofill自動填充的實(shí)現(xiàn)

    Mysql中zerofill自動填充的實(shí)現(xiàn)

    MySQL中的zero fill可以設(shè)置自動填充零,以便固定位數(shù)的數(shù)字能夠保持一致的格式,本文就介紹了Mysql中zerofill自動填充,感興趣的可以了解一下
    2023-09-09
  • MySQL數(shù)據(jù)庫運(yùn)維之?dāng)?shù)據(jù)恢復(fù)的方法

    MySQL數(shù)據(jù)庫運(yùn)維之?dāng)?shù)據(jù)恢復(fù)的方法

    本篇文章主要介紹了MySQL數(shù)據(jù)庫運(yùn)維之?dāng)?shù)據(jù)恢復(fù)的方法,此處總結(jié)一下恢復(fù)方案,并結(jié)合數(shù)據(jù)庫的二進(jìn)制日志做下數(shù)據(jù)恢復(fù)的示范。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 刪除MySQL數(shù)據(jù)庫的簡單教程

    刪除MySQL數(shù)據(jù)庫的簡單教程

    這篇文章主要介紹了刪除MySQL數(shù)據(jù)庫的簡單教程,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • MySQL中修改庫名的操作教程

    MySQL中修改庫名的操作教程

    這篇文章主要介紹了MySQL中修改庫名的操作教程,是MySQL學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05

最新評論