数据库迁移 | 数据库 |《Laravel 5.8 中文文档 5.8》| Laravel China 社区


本站和网页 https://learnku.com/docs/laravel/5.8/migrations/3928 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

数据库迁移 | 数据库 |《Laravel 5.8 中文文档 5.8》| Laravel China 社区
Laravel
话题列表
社区 Wiki
优质外文
招聘求职
Laravel 实战教程
社区文档
登录
注册
Laravel 5.8 中文文档
展开或关闭
前言
发行说明
升级说明
贡献导引
入门指南
安装
配置信息
文件夹结构
Homestead
Valet
部署
核心架构
请求周期
服务容器
服务提供者
Facades
Contracts
基础功能
路由
中间件
CSRF 保护
控制器
请求
响应
视图
URL
Session
表单验证
错误
日志
前端开发
Blade 模板
本地化
前端指南
编译资源 Mix
安全相关
用户认证
API 认证
用户授权
Email 认证
加密解密
哈希
重置密码
综合话题
Artisan 命令行
广播系统
缓存系统
集合
事件系统
文件存储
辅助函数
邮件发送
消息通知
扩展包开发
队列
任务调度
数据库
快速入门
查询构造器
分页
数据库迁移
数据填充
Redis
Eloquent ORM
快速入门
模型关联
Eloquent 集合
修改器
API 资源
序列化
测试相关
快速入门
HTTP 测试
命令行测试
数据库测试
测试模拟器 Mocking
官方扩展包
Cashier 交易工具包
浏览器测试 Dusk
Envoy 部署工具
Horizon 队列管理工具
Passport OAuth 认证
Scout 全文搜索
Socialite 社会化登录
Telescope 应用调试工具
Laravel
首页
Laravel
Go
PHP
Vue.js
Python
Java
MySQL
Rust
LK
Elasticsearch
F2E 前端
Server
程序员
Database
DevTools
Computer Science
手机开发
AdonisJS
社区
Wiki
教程
Laravel 实战教程首页
《L01 Laravel 教程 - Web 开发实战入门》
《L02 Laravel 教程 - Web 开发实战进阶》
《L03 Laravel 教程 - 实战构架 API 服务器》
《L04 Laravel 教程 - 微信小程序从零到发布》
《L05 Laravel 教程 - 电商实战》
《L06 Laravel 教程 - 电商进阶》
《LX1 Laravel / PHP 扩展包视频教程》
《LX2 PHP 扩展包实战教程 - 从入门到发布》
《L07 Laravel 教程 - Laravel TDD 测试实战》
《LX3 Laravel 性能优化入门》
《LX4 Laravel / PHP 五分钟视频》
文档
社区文档首页
《Laravel 中文文档》
《Laravel 速查表》
《PHP 代码简洁之道》
《Laravel 编码技巧》
《Dcat Admin 中文文档》
《Laravel Nova 中文文档》
《Lumen 中文文档》
《Dingo API 中文文档》
《 Laravel 项目开发规范》
《构建 Laravel 开发环境》
登录
注册
微信登录
提交改进
数据库迁移
5.8
9.x
8.5
8.x
7.x
6.x
5.8
5.7
5.6
5.5
5.4
5.3
5.2
5.1
Laravel 5.8 中文文档
未匹配的标注
本文档最新版为 9.x,旧版本可能放弃维护,推荐阅读最新版!
数据库: 迁移
简介
生成迁移
迁移结构
运行迁移
回滚迁移
数据表
创建数据表
重命名 / 删除数据表
字段
创建字段
字段修饰
修改字段
删除字段
索引
创建索引
重命名索引
删除索引
外键约束
简介
迁移就像是数据库的版本控制, 允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和 Laravel 的 数据库结构生成器配合使用,让你轻松地构建数据库结构。如果你曾经试过让同事手动在数据库结构中添加字段,那么数据库迁移可以让你不再需要做这样的事情。
Laravel 的 Schema 门面 对所有 Laravel 支持的数据库系统提供了创建和操作数据表的相应支持。
生成迁移
使用 Artisan命令 make:migration 来创建迁移。
php artisan make:migration create_users_table
新的迁移位于 database/migrations 目录下。每个迁移文件名都包含时间戳,以便让 Laravel 确认迁移的顺序。
--table 和 --create 选项可用来指定数据表的名称,或是该迁移被执行时是否将创建的新数据表。这些选项需在预生成迁移文件时填入指定的数据表:
php artisan make:migration create_users_table --create=users
php artisan make:migration add_votes_to_users_table --table=users
如果你想要指定生成迁移指定一个自定义输出路径,则可以在运行 make:migration 命令时添加 --path 选项,给定的路径必须是相对于应用程序的基本路径。
迁移结构
迁移类通常会包含2个方法: up 和 down。 up 方法用于添加新的数据表, 字段或者索引到数据库, 而 down 方法就是 up 方法的反操作,和 up 里的操作相反。
在这2个方法中都要用到Laravel 的 Schema 构建器来创建和修改表,
若要了解 Schema 生成器中的所有可用方法 ,可以查看它的文档。比如,创建 flights 表的简单示例:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateFlightsTable extends Migration
/**
* 运行数据库迁移
* @return void
*/
public function up()
Schema::create('flights', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('airline');
$table->timestamps();
});
/**
* 回滚数据库迁移
* @return void
*/
public function down()
Schema::drop('flights');
运行迁移
执行 Artisan 命令 migrate 来运行所有未完成的迁移:
php artisan migrate
{注意} 如果你正在使用 Homestead 虚拟机,你应该在你的虚拟机里执行这个命令。
在生产环境强制执行迁移
一些迁移操作是具有破坏性的, 这意味着可能会导致数据丢失。 为了防止有人在生产环境中运行这些命令, 系统会在这些命令被运行之前与你进行确认。如果要强制忽略系统的提示运行命令, 则可以使用 --force 标记:
php artisan migrate --force
回滚迁移
若要回滚最后一次迁移, 可以使用 rollback 命令。 此命令将回滚最后一次“迁移”的操作,其中可能包含多个迁移文件:
php artisan migrate:rollback
你可以在 rollback 命令后面加上 step 参数,来限制回滚迁移的个数。 例如,以下命令将回滚最近五次迁移:
php artisan migrate:rollback --step=5
migrate:reset 命令可以回滚应用程序中的所有迁移:
php artisan migrate:reset
使用单个命令来执行回滚或迁移
migrate:refresh 命令不仅会回滚数据库的所有迁移还会接着运行 migrate 命令。 这个命令可以高效地重建整个数据库:
php artisan migrate:refresh
// 刷新数据库结构并执行数据填充
php artisan migrate:refresh --seed
使用 refresh 命令并提供 step 参数来回滚并再执行最后指定的迁移数。例如, 以下命令将回滚并重新执行最后五次迁移:
php artisan migrate:refresh --step=5
删除所有表 & 迁移
The migrate:fresh 命令会从数据库中删除所有表,然后执行 migrate 命令:
php artisan migrate:fresh
php artisan migrate:fresh --seed
数据表
创建数据表
可以使用 Schema facade的 create 方法来创建新的数据库表。 create 方法接受两个参数:第一个参数为数据表的名称,第二个参数是 Closure ,此闭包会接收一个用于定义新数据表的 Blueprint 对象:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
});
当然,在创建数据表的时候,可以使用任何数据库结构生成器的 字段方法 来定义数据表的字段。
检查数据表 / 字段是否存在
可以使用 hasTable 和 hasColumn 方法来检查数据表或字段是否存在:
if (Schema::hasTable('users')) {
//
if (Schema::hasColumn('users', 'email')) {
//
数据库连接 & 表选项
如果要对非默认连接的数据库连接执行结构操作,可以使用 connection 方法:
Schema::connection('foo')->create('users', function (Blueprint $table) {
$table->increments('id');
});
你可以在数据库结构生成器上使用以下命令来定义表的选项:
命令
描述
$table->engine = 'InnoDB';
指定表存储引擎 (MySQL)。
$table->charset = 'utf8';
指定数据表的默认字符集 (MySQL)。
$table->collation = 'utf8_unicode_ci';
指定数据表默认的排序规则 (MySQL)。
$table->temporary();
创建临时表 (不支持SQL Server)。
重命名 / 删除数据表
若要重命名数据表,可以使用 rename 方法:
Schema::rename($from, $to);
删除一个已存在的数据表, 可使用 drop 或 dropIfExists 方法:
Schema::drop('users');
Schema::dropIfExists('users');
重命名带外键的数据表
在重命名表之前,你应该验证表上的任何外键约束在迁移文件中都有明确的名称,而不是让 Laravel 按照约定来设置一个名称。否则,外键的约束名称将引用旧表名。
字段
创建字段
使用 Schema facade 的 table 方法可以更新现有的数据表。如同 create 方法一样,table 方法会接受两个参数:一个是数据表的名称,另一个则是接收可以用来向表中添加字段的 Blueprint 实例的闭包:
Schema::table('users', function (Blueprint $table) {
$table->string('email');
});
可用的字段类型
数据库结构生成器包含构建表时可以指定的各种字段类型:
命令
描述
$table->bigIncrements('id');
递增 ID(主键),相当于「UNSIGNED BIG INTEGER」
$table->bigInteger('votes');
相当于 BIGINT
$table->binary('data');
相当于 BLOB
$table->boolean('confirmed');
相当于 BOOLEAN
$table->char('name', 100);
相当于带有长度的 CHAR
$table->date('created_at');
相当于 DATE
$table->dateTime('created_at');
相当于 DATETIME
$table->dateTimeTz('created_at');
相当于带时区 DATETIME
$table->decimal('amount', 8, 2);
相当于带有精度与基数 DECIMAL
$table->double('amount', 8, 2);
相当于带有精度与基数 DOUBLE
$table->enum('level', ['easy', 'hard']);
相当于 ENUM
$table->float('amount', 8, 2);
相当于带有精度与基数 FLOAT
$table->geometry('positions');
相当于 GEOMETRY
$table->geometryCollection('positions');
相当于 GEOMETRYCOLLECTION
$table->increments('id');
递增的 ID (主键),相当于「UNSIGNED INTEGER」
$table->integer('votes');
相当于 INTEGER
$table->ipAddress('visitor');
相当于 IP 地址
$table->json('options');
相当于 JSON
$table->jsonb('options');
相当于 JSONB
$table->lineString('positions');
相当于 LINESTRING
$table->longText('description');
相当于 LONGTEXT
$table->macAddress('device');
相当于 MAC 地址
$table->mediumIncrements('id');
递增 ID (主键) ,相当于「UNSIGNED MEDIUM INTEGER」
$table->mediumInteger('votes');
相当于 MEDIUMINT
$table->mediumText('description');
相当于 MEDIUMTEXT
$table->morphs('taggable');
相当于加入递增的 taggable_id 与字符串 taggable_type
$table->multiLineString('positions');
相当于 MULTILINESTRING
$table->multiPoint('positions');
相当于 MULTIPOINT
$table->multiPolygon('positions');
相当于 MULTIPOLYGON
$table->nullableMorphs('taggable');
相当于可空版本的 morphs() 字段
$table->nullableTimestamps();
相当于可空版本的 timestamps() 字段
$table->point('position');
相当于 POINT
$table->polygon('positions');
相当于 POLYGON
$table->rememberToken();
相当于可空版本的 VARCHAR(100) 的 remember_token 字段
$table->smallIncrements('id');
递增 ID (主键) ,相当于「UNSIGNED SMALL INTEGER」
$table->smallInteger('votes');
相当于 SMALLINT
$table->softDeletes();
相当于为软删除添加一个可空的 deleted_at 字段
$table->softDeletesTz();
相当于为软删除添加一个可空的 带时区的 deleted_at 字段
$table->string('name', 100);
相当于带长度的 VARCHAR
$table->text('description');
相当于 TEXT
$table->time('sunrise');
相当于 TIME
$table->timeTz('sunrise');
相当于带时区的 TIME
$table->timestamp('added_on');
相当于 TIMESTAMP
$table->timestampTz('added_on');
相当于带时区的 TIMESTAMP
$table->timestamps();
相当于可空的 created_at 和 updated_at TIMESTAMP
$table->timestampsTz();
相当于可空且带时区的 created_at 和 updated_at TIMESTAMP
$table->tinyIncrements('id');
相当于自动递增 UNSIGNED TINYINT
$table->tinyInteger('votes');
相当于 TINYINT
$table->unsignedBigInteger('votes');
相当于 Unsigned BIGINT
$table->unsignedDecimal('amount', 8, 2);
相当于带有精度和基数的 UNSIGNED DECIMAL
$table->unsignedInteger('votes');
相当于 Unsigned INT
$table->unsignedMediumInteger('votes');
相当于 Unsigned MEDIUMINT
$table->unsignedSmallInteger('votes');
相当于 Unsigned SMALLINT
$table->unsignedTinyInteger('votes');
相当于 Unsigned TINYINT
$table->uuid('id');
相当于 UUID
$table->year('birth_year');
相当于 YEAR
字段修饰
除了上述列出的字段类型之外,还有几个可以在添加字段到数据库表时使用的“修饰符”。例如,如果要把字段设置为“可空", 你可以使用 nullable 方法:
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});
以下是所有可用的字段修饰符的列表。此列表不包括 索引修饰符:
Modifier
Description
->after('column')
将此字段放置在其它字段 "之后" (MySQL)
->autoIncrement()
将 INTEGER 类型的字段设置为自动递增的主键
->charset('utf8')
指定一个字符集 (MySQL)
->collation('utf8_unicode_ci')
指定列的排序规则 (MySQL/SQL Server)
->comment('my comment')
为字段增加注释 (MySQL)
->default($value)
为字段指定 "默认" 值
->first()
将此字段放置在数据表的 "首位" (MySQL)
->nullable($value = true)
此字段允许写入 NULL 值(默认情况下)
->storedAs($expression)
创建一个存储生成的字段 (MySQL)
->unsigned()
设置 INTEGER 类型的字段为 UNSIGNED (MySQL)
->useCurrent()
将 TIMESTAMP 类型的字段设置为使用 CURRENT_TIMESTAMP 作为默认值
->virtualAs($expression)
创建一个虚拟生成的字段 (MySQL)
修改字段
先决条件
在修改字段之前,请确保将 doctrine/dbal 依赖添加到 composer.json 文件中。Doctrine DBAL 库用于确定字段的当前状态, 并创建对该字段进行指定调整所需的 SQL 查询:
composer require doctrine/dbal
更新字段属性
change 方法可以将现有的字段类型修改为新的类型或修改属性。
比如,你可能想增加。字符串字段的长度,可以使用 change 方法把 name 字段的长度从 25 增加到 50:
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});
我们应该将字段修改为可空:
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->nullable()->change();
});
{注} 只有下面的字段类型能被 "修改": bigInteger、 binary、 boolean、date、dateTime、dateTimeTz、decimal、integer、json、 longText、mediumText、smallInteger、string、text、time、 unsignedBigInteger、unsignedInteger and unsignedSmallInteger。
重命名字段
可以使用结构生成器上的 renameColumn 方法来重命名字段。在重命名字段前 , 请确保你的 composer.json 文件内已经加入 doctrine/dbal 依赖:
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
{注} 当前不支持 enum 类型的字段重命名。
删除字段
可以使用结构生成器上的 dropColumn 方法来删除字段。 在从 SQLite 数据库删除字段前,你需要在 composer.json 文件中加入 doctrine/dbal 依赖并在终端执行 composer update 来安装该依赖:
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});
你可以传递一个字段数组给 dropColumn 方法来删除多个字段:
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});
{注} 不支持在使用 SQLite 数据库时在单个迁移中删除或修改多个字段。
可用的命令别名
Command
Description
$table->dropRememberToken();
删除 remember_token 字段。
$table->dropSoftDeletes();
删除 deleted_at 字段。
$table->dropSoftDeletesTz();
dropSoftDeletes() 方法的别名。
$table->dropTimestamps();
删除 created_at and updated_at 字段。
$table->dropTimestampsTz();
dropTimestamps() 方法的别名。
索引
创建索引
结构生成器支持多种类型的索引。首先,先指定字段值唯一,即简单地在字段定义 之后链式调用 unique 方法来创建索引,例如:
$table->string('email')->unique();
或者,你也可以在定义完字段之后创建索引。例如:
$table->unique('email');
你甚至可以将数组传递给索引方法来创建一个复合(或合成)索引:
$table->index(['account_id', 'created_at']);
Laravel 会自动生成一个合理的索引名称,但你也可以传递第二个参数来自定义索引名称:
$table->unique('email', 'unique_email');
可用的索引类型
每个索引方法都接受一个可选的第二个参数来指定索引的名称。如果省略,名称将根据表和列的名称生成。
命令
描述
$table->primary('id');
添加主键
$table->primary(['id', 'parent_id']);
添加复合键
$table->unique('email');
添加唯一索引
$table->index('state');
添加普通索引
$table->spatialIndex('location');
添加空间索引(不支持 SQLite)
索引长度 & Mysql / MariaDB
Laravel 默认使用 utf8mb4 编码,它支持在数据库中储存 emojis 。如果你是在版本低于 5.7.7 的 MySQL 或者版本低于 10.2.2 的 MariaDB 上创建索引,那你就需要手动配置数据库迁移的默认字符串长度。
即在 AppServiceProvider 中调用 Schema::defaultStringLength 方法来配置它:
use Illuminate\Support\Facades\Schema;
/**
* 引导任何应用程序服务
* @return void
*/
public function boot()
Schema::defaultStringLength(191);
当然,你也可以选择开启数据库的 innodb_large_prefix 选项。至于如何正确开启,请自行查阅数据库文档。
重命名索引
若要重命名索引,你需要调用 renameIndex 方法。此方法接受当前索引名称作为其第一个参数,并将所需名称作为其第二个参数:
你需要将当前索引名称作为其第一个参数,并将新索引名称作为其第二个参数:
$table->renameIndex('from', 'to')
删除索引
若要删除索引,则必须指定索引的名称。Laravel 默认会自动将数据库名称、索引的字段名及索引类型简单地连接在一起作为名称。举例如下:
命令
描述
$table->dropPrimary('users_id_primary');
从 users 表中删除主键
$table->dropUnique('users_email_unique');
从 users 表中删除唯一索引
$table->dropIndex('geo_state_index');
从 geo 表中删除基本索引
$table->dropSpatialIndex('geo_location_spatialindex');
从 geo 表中删除空间索引(不支持 SQLite)
如果将字段数组传给 dropIndex 方法,会删除根据表名、字段和键类型生成的索引名称。
Schema::table('geo', function (Blueprint $table) {
$table->dropIndex(['state']); // 删除 'geo_state_index' 索引
});
外键约束
Laravel 还支持创建用于在数据库层中的强制引用完整性的外键约束。例如,让我们在 posts 表上定义一个引用 users 表的 id 字段的 user_id 字段:
Schema::table('posts', function (Blueprint $table) {
$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
还可以为 on delete 和 on update 属性指定所需的操作:
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
你可以使用 dropForeign 方法来删除外键。外键约束采用的命名方式与索引相同。即,将数据表名称和约束的字段连接起来,再加上 _foreign 后缀:
$table->dropForeign('posts_user_id_foreign');
或者,你也可以传递一个字段数组,在删除的时候会按照约定字段转换为对应的外键名称:
$table->dropForeign(['user_id']);
你可以在迁移文件中使用以下方法来开启或关闭外键约束:
Schema::enableForeignKeyConstraints();
Schema::disableForeignKeyConstraints();
{注} SQLite默认禁用外键约束。 使用SQLite时,请确保在数据库配置中启用[启用外键支持](/ docs / laravel/5.8 / database#configuration),然后再尝试在迁移中创建它们。
本文章首发在 LearnKu.com 网站上。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
原文地址:https://learnku.com/docs/laravel/5.8/mig...
译文地址:https://learnku.com/docs/laravel/5.8/mig...
上一篇
下一篇
Markdown 文本
纠错改进
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:5
推荐文章:
更多推荐...
问答
每天新增8640w数据,怎么存储比较好
16
46
11个月前
博客
强一致性的分布式事务几种模式对比(php有了新方案)
31
19
1年前
博客
laravel实现100w大量数据插入数据库
15
47
1年前
博客
对线面试官:InnoDB中一棵B+树能存多少行数据?
30
1年前
翻译
如何在 Laravel 代码中正确地使用数据库事务
21
1年前
翻译
18 个 Laravel 8 数据库查询优化建议
55
1年前
讨论数量: 13
发起讨论
只看当前版本
kiyoma
3年前
多人开发的时候,migration 不会有问题吗?
个点赞 | 23 个回复 |
问答
| 课程版本 5.5
Neox
4年前
table 的 comment 怎么创建?
个点赞 | 11 个回复 |
问答
| 课程版本 5.5
15072306389
3年前
觉得文档内容太多太复杂的可以这个
个点赞 | 0 个回复 |
分享
| 课程版本 5.4
osang
2年前
数据库迁移如何解决外键依赖问题?
个点赞 | 2 个回复 |
问答
| 课程版本 5.8
Chaly
4年前
执行迁移文件: PHP artisan migrate ,会报错 SQLSTATE [42000]: Syntax error or access violation: 1071 Specifi ed key was too long; max key length is 767 bytes?
个点赞 | 8 个回复 |
问答
| 课程版本 5.5
xgrit
2年前
项目配置完数据库执行 PHP artisan magerate 报错
个点赞 | 4 个回复 |
问答
| 课程版本 5.8
gaoxiang
4年前
修改字段为 text 类型会报错 BLOB/TEXT column 'permission_id' used in key specification wit hout a key length?
个点赞 | 4 个回复 |
问答
| 课程版本 5.5
gaoxiang
4年前
新增字段和索引回滚的时候怎么删除索引和字段?
个点赞 | 4 个回复 |
问答
| 课程版本 5.1
MoYuEr
9个月前
在数据库迁移时被创建了意料之外的表!
个点赞 | 3 个回复 |
分享
| 课程版本 8.x
chenvle
11个月前
修改字段 运行 php artisan migrate 报错
个点赞 | 3 个回复 |
问答
| 课程版本 5.5
一冉再
4年前
Laravel 5.5 并不支持 timestamp 类型的字段的修改?
个点赞 | 3 个回复 |
问答
| 课程版本 5.5
Flourishing
4年前
不是说 string 类型的不能修改么?难道是我理解错了?
个点赞 | 2 个回复 |
问答
| 课程版本 5.5
caiyaonan
3年前
迁移文件的字段是不是没有 zerofille 修饰呢
个点赞 | 1 个回复 |
问答
| 课程版本 5.4
社区赞助商
成为赞助商
关于 LearnKu
LearnKu 是终身编程者的修道场
做最专业、严肃的技术论坛
LearnKu 诞生的故事
资源推荐
《社区使用指南》
《文档撰写指南》
《LearnKu 社区规范》
《提问的智慧》
服务提供商
其他信息
成为版主
所有测验
联系站长(反馈建议)
粤ICP备18099781号-6
粤公网安备 44030502004330号
违法和不良信息举报
由 Summer 设计和编码 ❤
请登录
提交
忘记密码?
or
注册
第三方账号登录
微信登录
GitHub 登录
内容举报
匿名举报,为防止滥用,仅管理员可见举报者。
我要举报该,理由是:
垃圾广告:恶意灌水、广告、推广等内容
无意义内容:测试、灌水、文不对题、消极内容、文章品质太差等
违规内容:色情、暴利、血腥、敏感信息等
不友善内容:人身攻击、挑衅辱骂、恶意行为
科学上网:翻墙、VPN、Shadowsocks,政策风险,会被关站!
不懂提问:提问太随意,需要再做一遍《提问的智慧》测验
随意提问:提问没有发布在社区问答分类下
排版混乱:没有合理使用 Markdown 编写文章,未使用代码高亮
内容结构混乱:逻辑不清晰,内容混乱,难以阅读
标题随意:标题党、标题不释义
尊重版权:分享付费课程、破解软件(付费),侵犯作者劳动成果
其他理由:请补充说明
举报
取消