30 lines
20 KiB
JavaScript
30 lines
20 KiB
JavaScript
import{_ as i,o as a,c as t,a2 as h}from"./chunks/framework.B-QBKwc1.js";const E=JSON.parse('{"title":"数据库建表","description":"建表是模块开发的第一步。","frontmatter":{},"headers":[],"relativePath":"zh/guide/database.md","filePath":"zh/guide/database.md"}'),k={name:"zh/guide/database.md"};function n(l,s,p,e,d,F){return a(),t("div",null,[...s[0]||(s[0]=[h(`<h1 id="_3-2-数据库建表" tabindex="-1">3.2 数据库建表 <a class="header-anchor" href="#_3-2-数据库建表" aria-label="Permalink to "3.2 数据库建表""></a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p>建表是模块开发的第一步。所有表必须包含公共字段(id、软删除、审计字段),这是 BaseModel 自动处理的基础。</p></div><h2 id="公共字段规范" tabindex="-1">公共字段规范 <a class="header-anchor" href="#公共字段规范" aria-label="Permalink to "公共字段规范""></a></h2><p>所有业务表必须包含以下公共字段:</p><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">-- 公共字段(每个表都必须包含)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">id </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">INT</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> PRIMARY KEY</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> AUTO_INCREMENT COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">主键</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">is_delete </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">TINYINT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">1</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 0</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">软删除 0=正常 1=已删除</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">create_user </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">VARCHAR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">50</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> ''</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">创建人</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">create_time </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DATETIME</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">创建时间</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">update_user </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">VARCHAR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">50</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> ''</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">更新人</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">update_time </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DATETIME</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">更新时间</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">为什么必须包含这些字段?</p><ul><li><code>is_delete</code>:BaseModel 的全局查询范围 <code>soft_delete</code> 会自动过滤 <code>is_delete=1</code> 的数据</li><li><code>create_user</code> / <code>create_time</code>:BaseModel 的 <code>onBeforeInsert</code> 事件自动填充</li><li><code>update_user</code> / <code>update_time</code>:BaseModel 的 <code>onBeforeUpdate</code> 事件自动填充</li></ul></div><h2 id="建表-SQL-示例-example-模块-" tabindex="-1">建表 SQL 示例(example 模块) <a class="header-anchor" href="#建表-SQL-示例-example-模块-" aria-label="Permalink to "建表 SQL 示例(example 模块)""></a></h2><div class="language-sql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CREATE</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> TABLE</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> think_example</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> (</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> -- 主键</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> id </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">INT</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> PRIMARY KEY</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> AUTO_INCREMENT COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">主键</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> -- 业务字段</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> name</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> VARCHAR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">200</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">NOT NULL</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">案例名称</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> type</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> TINYINT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">1</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 0</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">案例类型(字典 example_type)</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> status</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> TINYINT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">1</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 0</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">案例状态(字典 example_status)</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> sort </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">INT</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> DEFAULT</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 0</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">排序值(越小越靠前)</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> avatar </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">VARCHAR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">500</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> ''</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">头像(文件路径)</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> -- 公共字段(必须)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> is_delete </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">TINYINT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">1</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 0</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">软删除 0=正常 1=已删除</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> create_user </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">VARCHAR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">50</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> ''</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">创建人</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> create_time </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DATETIME</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">创建时间</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> update_user </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">VARCHAR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">50</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> ''</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">更新人</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> update_time </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DATETIME</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> COMMENT </span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">更新时间</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">,</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> -- 索引</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> INDEX</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> idx_type (</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">type</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">),</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> INDEX</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> idx_status (</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">status</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">),</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> INDEX</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> idx_sort (sort)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) ENGINE</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">InnoDB </span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">DEFAULT</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> CHARSET</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">utf8mb4 COMMENT</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">=</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">案例演示表</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">;</span></span></code></pre></div><h2 id="字段与-Logic-属性对应关系" tabindex="-1">字段与 Logic 属性对应关系 <a class="header-anchor" href="#字段与-Logic-属性对应关系" aria-label="Permalink to "字段与 Logic 属性对应关系""></a></h2><table tabindex="0"><thead><tr><th>数据库字段</th><th>类型</th><th>Logic 属性</th><th>说明</th></tr></thead><tbody><tr><td><code>name</code></td><td>VARCHAR(200)</td><td><code>pageLikeFields</code></td><td>LIKE 模糊搜索</td></tr><tr><td><code>type</code></td><td>TINYINT(1)</td><td><code>pageEqFields</code> + <code>serializeMaps</code></td><td>精确匹配 + 枚举翻译</td></tr><tr><td><code>status</code></td><td>TINYINT(1)</td><td><code>pageEqFields</code> + <code>serializeMaps</code></td><td>精确匹配 + 枚举翻译</td></tr><tr><td><code>sort</code></td><td>INT</td><td><code>pageOrderBy</code></td><td>默认排序字段</td></tr><tr><td><code>avatar</code></td><td>VARCHAR(500)</td><td><code>fileFields</code></td><td>文件字段,自动处理</td></tr></tbody></table><h2 id="常见字段类型参考" tabindex="-1">常见字段类型参考 <a class="header-anchor" href="#常见字段类型参考" aria-label="Permalink to "常见字段类型参考""></a></h2><table tabindex="0"><thead><tr><th>用途</th><th>推荐类型</th><th>示例</th></tr></thead><tbody><tr><td>主键</td><td><code>INT AUTO_INCREMENT</code></td><td><code>id INT PRIMARY KEY AUTO_INCREMENT</code></td></tr><tr><td>外键</td><td><code>INT DEFAULT 0</code></td><td><code>category_id INT DEFAULT 0</code></td></tr><tr><td>短文本</td><td><code>VARCHAR(n)</code></td><td><code>name VARCHAR(200)</code></td></tr><tr><td>长文本</td><td><code>TEXT</code></td><td><code>content TEXT</code></td></tr><tr><td>布尔值</td><td><code>TINYINT(1)</code></td><td><code>status TINYINT(1) DEFAULT 0</code></td></tr><tr><td>整数</td><td><code>INT</code></td><td><code>sort INT DEFAULT 0</code></td></tr><tr><td>日期时间</td><td><code>DATETIME</code></td><td><code>create_time DATETIME</code></td></tr><tr><td>文件路径</td><td><code>VARCHAR(500)</code></td><td><code>avatar VARCHAR(500)</code></td></tr></tbody></table>`,12)])])}const g=i(k,[["render",n]]);export{E as __pageData,g as default};
|