ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MySQL 默认值使用方法

MySQL 默认值使用方法 核心区分两大场景常量默认值MySQL5.7 / 8.0 都支持不用括号函数表达式默认值仅MySQL8.0.13支持必须包一层()特例CURRENT_TIMESTAMP8.0可以不加括号也可以写(CURRENT_TIMESTAMP)一、建表时指定默认值CREATE TABLE1. 常量默认5.7、8.0通用CREATETABLEt_const_demo(idINTPRIMARYKEYAUTO_INCREMENT,ageINTDEFAULT0,-- 数值常量nameVARCHAR(50)DEFAULT,-- 空字符串statusTINYINTDEFAULT1,-- 状态默认1enableBOOLEANDEFAULTTRUE,-- BOOLEAN底层TINYINTTRUE1 FALSE0remarkVARCHAR(200)DEFAULTNULL-- 默认NULL);插入时不写该字段自动填充默认值INSERTINTOt_const_demo(age)VALUES(18);-- name自动status自动1enable1remarkNULL2. 函数表达式默认仅MySQL8.0.13必须带括号CREATETABLEt_expr_demo(idINTPRIMARYKEYAUTO_INCREMENT,uidCHAR(36)DEFAULT(UUID()),uid_binBINARY(16)DEFAULT(UUID_TO_BIN(UUID())),meta JSONDEFAULT(JSON_ARRAY()),conn_uidINTDEFAULT(CONNECTION_ID()),db_nameVARCHAR(64)DEFAULT(DATABASE()),created_atDATETIMEDEFAULTCURRENT_TIMESTAMP);⚠️ 5.7 执行上面DEFAULT(UUID())会直接报错5.7只允许CURRENT_TIMESTAMP这一个函数作为默认值。二、已有表修改字段默认值ALTER TABLE语法ALTER TABLE 表名 MODIFY COLUMN 字段定义;-- 示例1给已有字段设置常量默认值ALTERTABLEt_const_demoMODIFYCOLUMNremarkVARCHAR(200)DEFAULT;-- 示例28.0给字段设置函数默认值ALTERTABLEt_expr_demoMODIFYCOLUMNuidCHAR(36)DEFAULT(UUID());注意ALTER不会修改表中已经存在的旧数据只对新插入的记录生效旧数据想批量更新需要单独执行 UPDATE。三、ON UPDATE时间字段专属不是DEFAULTcreated_atDATETIMEDEFAULTCURRENT_TIMESTAMP,updated_atDATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP新增行updated_at填入当前时间更新该行其他字段时自动刷新updated_at为最新时间四、插入语句如何控制默认值✅ 方式1不写该字段自动使用默认值最常用INSERTINTOt_expr_demo(id)VALUES(NULL);-- uid、meta、created_at全部自动填充默认值✅ 方式2显式写 DEFAULT 关键字主动使用默认值INSERTINTOt_expr_demo(id,uid)VALUES(NULL,DEFAULT);-- uid使用DEFAULT定义的UUID()✅ 方式3手动传值覆盖默认值INSERTINTOt_expr_demo(id,uid)VALUES(NULL,my-custom-uuid);-- 会使用你传入的值不再执行默认函数五、查看表的默认值定义-- 方法1查看建表语句SHOWCREATETABLEt_expr_demo;-- 方法2查询information_schemaSELECTCOLUMN_NAME,COLUMN_DEFAULTFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_SCHEMA你的数据库名ANDTABLE_NAMEt_expr_demo;六、重要限制 避坑5.7版本限制仅允许CURRENT_TIMESTAMP作为函数默认值UUID() / RAND() / DATABASE() 全部不能写DEFAULT。5.7如果需要UUID只能业务代码生成后传入SQL。表达式默认不能包含子查询、自定义函数、存储过程、引用其他字段的值。❌col INT DEFAULT (other_col 1)不支持不能引用同表其他列。TEXT/BLOBMySQL 8.0才支持默认值写法content TEXT DEFAULT ()5.7 TEXT/BLOB不能设置默认值。NULL 和 ‘’ 不要混淆VARCHAR DEFAULT NULL和VARCHAR DEFAULT 完全不一样NULL未知空字符串有值是空文本主从复制注意UUID()、RAND()、CONNECTION_ID()、CURRENT_USER()这类和会话相关的函数binlog推荐ROW模式STATEMENT模式主从数据不一致风险很高。七、综合完整示例MySQL8.0CREATETABLEbusiness_table(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT主键,biz_noCHAR(36)DEFAULT(UUID())COMMENT业务唯一编号,statusTINYINTDEFAULT0COMMENT状态 0禁用1启用,amountDECIMAL(12,2)DEFAULT0.00COMMENT金额默认0,ext_json JSONDEFAULT(JSON_OBJECT())COMMENT扩展JSON默认空对象,create_dbVARCHAR(64)DEFAULT(DATABASE())COMMENT记录所属库,created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT创建时间,updated_atDATETIMEDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT更新时间)ENGINEInnoDBDEFAULTCHARSETutf8mb4;
返回列表