最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)類型與表操作全指南(?從基礎(chǔ)到高級(jí)實(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ù)值類型用于存儲(chǔ)數(shù)字,包括整數(shù)和浮點(diǎn)數(shù):

類型大小(字節(jié))范圍(有符號(hào))說明
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 -- 無符號(hào)小整數(shù)
);

日期時(shí)間類型

日期和時(shí)間類型用于存儲(chǔ)時(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í)間戳,自動(dòng)更新
YEARYYYY1901 到 2155年份值

字符串類型

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

類型最大長度說明
CHAR(n)255字符定長字符串,空格填充
VARCHAR(n)65,535字符變長字符串,節(jié)省空間
TEXT65,535字符長文本數(shù)據(jù)
BLOB65,535字節(jié)二進(jìn)制大對(duì)象
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存儲(chǔ)數(shù)字
    • 用DATE代替DATETIME如果不需要時(shí)間部分
    • 用ENUM代替VARCHAR存儲(chǔ)固定選項(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í)自動(dòng)刪除從表相關(guān)記錄
    • ON DELETE SET NULL:將外鍵設(shè)為NULL
    • 謹(jǐn)慎使用CASCADE避免誤刪連鎖反應(yīng)
  • 字符集選擇
    • 推薦utf8mb4支持所有Unicode字符(包括emoji)
    • 校對(duì)規(guī)則:utf8mb4_unicode_ci(大小寫不敏感)
  • 存儲(chǔ)引擎選擇
SHOW ENGINES; -- 查看支持的引擎
  • InnoDB:支持事務(wù)、行級(jí)鎖(默認(rèn))
  • MyISAM:全文索引,但不支持事務(wù)
  • Memory:數(shù)據(jù)存儲(chǔ)在內(nèi)存中
  • 性能優(yōu)化
    • 避免過度使用ENUM(修改值需重建表)
    • TEXT/BLOB列單獨(dú)存到副表
    • 定期分析表優(yōu)化存儲(chǔ):
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:存儲(chǔ)引擎轉(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ǔ)到高級(jí)實(shí)踐與表操作全指南的文章就介紹到這了,更多相關(guān)mysql數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL備份時(shí)排除指定數(shù)據(jù)庫的方法

    MySQL備份時(shí)排除指定數(shù)據(jù)庫的方法

    這篇文章主要介紹了MySQL備份時(shí)排除指定數(shù)據(jù)庫的方法的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 通過實(shí)例學(xué)習(xí)MySQL分區(qū)表原理及常用操作

    通過實(shí)例學(xué)習(xí)MySQL分區(qū)表原理及常用操作

    我們?cè)囍胍幌? 在生產(chǎn)環(huán)境中什么最重要? 我感覺在生產(chǎn)環(huán)境中應(yīng)該沒有什么比數(shù)據(jù)跟更為重要. 那么我們?cè)撊绾伪WC數(shù)據(jù)不丟失、或者丟失后可以快速恢復(fù)呢?只要看完這篇大家應(yīng)該就能對(duì)MySQL中數(shù)據(jù)備份有一定了解
    2019-05-05
  • 淺析centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar

    淺析centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar

    這篇文章主要介紹了centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar的相關(guān)知識(shí),需要的朋友可以參考下
    2020-01-01
  • 深度解析MySQL 5.7之臨時(shí)表空間

    深度解析MySQL 5.7之臨時(shí)表空間

    盡管臨時(shí)表在實(shí)際在線場景中很少會(huì)去顯式使用,但在某些運(yùn)維場景還是需要到的,在MySQL5.7中,專門針對(duì)臨時(shí)表做了些優(yōu)化,下面這篇文章我們來一起深入的解析MySQL 5.7之臨時(shí)表空間,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • mysql中g(shù)rant?all?privileges?on賦給用戶遠(yuǎn)程權(quán)限方式

    mysql中g(shù)rant?all?privileges?on賦給用戶遠(yuǎn)程權(quán)限方式

    這篇文章主要介紹了mysql中g(shù)rant?all?privileges?on賦給用戶遠(yuǎn)程權(quán)限方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MySQL觸發(fā)器的使用

    MySQL觸發(fā)器的使用

    觸發(fā)器用于在 MySQL 執(zhí)行插入、更新或刪除語句時(shí),自動(dòng)觸發(fā)執(zhí)行其他SQL代碼。本文講解觸發(fā)器的正確使用方式
    2021-05-05
  • 深入了解MySQL中聚合函數(shù)的使用

    深入了解MySQL中聚合函數(shù)的使用

    這篇文章主要為大家詳細(xì)介紹一下MySQL中聚合函數(shù)的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)MySQL有一定幫助,需要的可以參考一下
    2022-07-07
  • MySQL查找NULL值的全面指南

    MySQL查找NULL值的全面指南

    在數(shù)據(jù)庫中,NULL 值表示缺失或未知的數(shù)據(jù),在 MySQL 中,我們可以使用特定的查詢語句來查找包含 NULL 值的數(shù)據(jù),本文將詳細(xì)介紹如何在 MySQL 中查找 NULL 值,并提供相關(guān)實(shí)例和代碼片段,需要的朋友可以參考下
    2024-05-05
  • 關(guān)于Mysql插入中文字符報(bào)錯(cuò)ERROR 1366(HY000)的解決方法

    關(guān)于Mysql插入中文字符報(bào)錯(cuò)ERROR 1366(HY000)的解決方法

    這篇文章主要介紹了關(guān)于Mysql插入中文字符報(bào)錯(cuò)ERROR 1366(HY000)的解決方法,在我們?nèi)粘J褂胢ysql的過程中會(huì)經(jīng)常遇到各種報(bào)錯(cuò),今天我們就來看一下ERROR 1366報(bào)錯(cuò)的解決方法吧
    2023-07-07
  • MySQL實(shí)現(xiàn)自動(dòng)化部署腳本的詳細(xì)教程

    MySQL實(shí)現(xiàn)自動(dòng)化部署腳本的詳細(xì)教程

    在當(dāng)前的DevOps環(huán)境中,自動(dòng)化部署已成為提升運(yùn)維效率的核心手段,本教程將手把手教你編寫一個(gè)智能化的MySQL部署腳本,感興趣的小伙伴跟著小編一起來看看吧
    2025-03-03

最新評(píng)論

明光市| 中西区| 岳普湖县| 中卫市| 和田县| 霍林郭勒市| 绵阳市| 定边县| 原平市| 宝清县| 四平市| 瑞金市| 韶山市| 平阴县| 潼关县| 上杭县| 崇仁县| 大新县| 广宗县| 南昌市| 奉化市| 托克托县| 文水县| 河间市| 贵南县| 库伦旗| 子长县| 苍南县| 高雄县| 禹州市| 瓮安县| 公安县| 南和县| 方城县| 桓仁| 屏山县| 松原市| 龙海市| 安西县| 胶南市| 平江县|