laravel5.5資料庫遷移入門實踐
Laravel裡面對資料庫設計了一套版本控制方式——資料庫遷移,以下是個人學習入門的實踐過程。
一、生成遷移檔案
1. windows進入進入計算機dos系統,跳轉到專案根目錄,執行以下命令:
(1)第一次生成遷移檔案時,需要先安裝遷移(以後操作不需要執行這一步了)
php artisan migrate:install
(2)生成goods遷移檔案
// 指定新增一個goods表的遷移檔案
php artisan make:migration create_goods_table --create=goods
執行後如下:
2. 此時在/database/migrations/下生成了遷移檔案:
3. 遷移檔案內容結構
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateGoodsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('goods', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('goods'); } }
說明:
(1)up方法是用於新增表、列及索引到資料庫;
(2)down方法是up的反方法。
二、設計表結構
目標是建一個goods表,包含欄位有:id(主鍵、自增)、goods_name(varchar型別,長度60)、goods_price(decimal型別,長度10,精確到小數點後2位)、num(庫存數量,Int型別)、descr(商品描述,text型別),編輯up方法,程式碼如下:
public function up() { Schema::create('goods', function (Blueprint $table) { $table->increments('id'); // 資料庫主鍵自增ID $table->string('goods_name',60); // 商品名稱,varchar,長度限制為60 $table->decimal('goods_price',10,2); // 商品價格,decimal,長度10,精度2 $table->integer('num'); // 商品數量,int $table->text('descr'); // 商品描述,text // $table->timestamps(); // 自動增加一個create_at、update_at時間欄位,此處不要 }); }
注意:
1. 遷移檔案生成的資料表引擎預設為“MYISAM”,如果要生成“INNODB”引擎,需要在遷移檔案總加入:
$table->engine = 'InnoDB';
2. 如果要指定表字符集為utf8,需要加入:
$table->charset = 'utf8';
資料型別對應的設定欄位函式參考下表,拷貝自Laravel5.5手冊:
命令 | 描述 |
---|---|
$table->bigIncrements('id'); |
自增ID,型別為bigint |
$table->bigInteger('votes'); |
等同於資料庫中的 BIGINT 型別 |
$table->binary('data'); |
等同於資料庫中的 BLOB 型別 |
$table->boolean('confirmed'); |
等同於資料庫中的 BOOLEAN 型別 |
$table->char('name', 4); |
等同於資料庫中的 CHAR 型別 |
$table->date('created_at'); |
等同於資料庫中的 DATE 型別 |
$table->dateTime('created_at'); |
等同於資料庫中的 DATETIME 型別 |
$table->dateTimeTz('created_at'); |
等同於資料庫中的 DATETIME 型別(帶時區) |
$table->decimal('amount', 5, 2); |
等同於資料庫中的 DECIMAL 型別,帶一個精度和範圍 |
$table->double('column', 15, 8); |
等同於資料庫中的 DOUBLE 型別,帶精度, 總共15位數字,小數點後8位 |
$table->enum('choices', ['foo', 'bar']); |
等同於資料庫中的 ENUM 型別 |
$table->float('amount'); |
等同於資料庫中的 FLOAT 型別 |
$table->increments('id'); |
資料庫主鍵自增ID |
$table->integer('votes'); |
等同於資料庫中的 INTEGER 型別 |
$table->ipAddress('visitor'); |
等同於資料庫中的 IP 地址 |
$table->json('options'); |
等同於資料庫中的 JSON 型別 |
$table->jsonb('options'); |
等同於資料庫中的 JSONB 型別 |
$table->longText('description'); |
等同於資料庫中的 LONGTEXT 型別 |
$table->macAddress('device'); |
等同於資料庫中的 MAC 地址 |
$table->mediumIncrements('id'); |
自增ID,型別為無符號的 mediumint |
$table->mediumInteger('numbers'); |
等同於資料庫中的 MEDIUMINT 型別 |
$table->mediumText('description'); |
等同於資料庫中的 MEDIUMTEXT 型別 |
$table->morphs('taggable'); |
新增一個 INTEGER 型別的 taggable_id 列和一個 STRING 型別的 taggable_type 列 |
$table->nullableTimestamps(); |
和 timestamps() 一樣但允許 NULL 值 |
$table->rememberToken(); |
新增一個 remember_token 列: VARCHAR(100) NULL |
$table->smallIncrements('id'); |
自增ID,型別為無符號的 smallint |
$table->smallInteger('votes'); |
等同於資料庫中的 SMALLINT 型別 |
$table->softDeletes(); |
新增一個 deleted_at 列用於軟刪除 |
$table->string('email'); |
等同於資料庫中的 VARCHAR 列 |
$table->string('name', 100); |
等同於資料庫中的 VARCHAR,帶一個長度 |
$table->text('description'); |
等同於資料庫中的 TEXT 型別 |
$table->time('sunrise'); |
等同於資料庫中的 TIME 型別 |
$table->timeTz('sunrise'); |
等同於資料庫中的 TIME 型別(帶時區) |
$table->tinyInteger('numbers'); |
等同於資料庫中的 TINYINT 型別 |
$table->timestamp('added_on'); |
等同於資料庫中的 TIMESTAMP 型別 |
$table->timestampTz('added_on'); |
等同於資料庫中的 TIMESTAMP 型別(帶時區) |
$table->timestamps(); |
新增 created_at 和 updated_at 列 |
$table->timestampsTz(); |
新增 created_at 和 updated_at 列(帶時區) |
$table->unsignedBigInteger('votes'); |
等同於資料庫中無符號的 BIGINT 型別 |
$table->unsignedInteger('votes'); |
等同於資料庫中無符號的 INT 型別 |
$table->unsignedMediumInteger('votes'); |
等同於資料庫中無符號的 MEDIUMINT 型別 |
$table->unsignedSmallInteger('votes'); |
等同於資料庫中無符號的 SMALLINT 型別 |
$table->unsignedTinyInteger('votes'); |
等同於資料庫中無符號的 TINYINT 型別 |
$table->uuid('id'); |
等同於資料庫的UUID |
每一個欄位都可以進行註釋和增加預設值,需要使用“列修改器”:
修改器 | 描述 |
---|---|
->after('column') |
將該列置於另一個列之後 (僅適用於MySQL) |
->comment('my comment') |
添加註釋資訊 |
->default($value) |
指定列的預設值 |
->first() |
將該列置為表中第一個列 (僅適用於MySQL) |
->nullable() |
允許該列的值為NULL |
->storedAs($expression) |
建立一個儲存生成列(只支援MySQL) |
->unsigned() |
設定 integer 列為 UNSIGNED |
->virtualAs($expression) |
建立一個虛擬生成列(只支援MySQL) |
列修改器使用舉例:
Schema::table('goods', function ($table) {
$table->string('goods_name',60)->nullable(); // 允許商品名稱為空
$table->integer('num')->comment('商品數量'); //添加註釋“商品數量”
});
三、執行遷移
執行遷移前,我囉嗦一句,先到.env把資料庫連線配置好!!!遇到某些同學,真的是哭笑不得。
進入dos系統,跳轉到專案根目錄,執行以下程式碼:
php artisan migrate
執行後如下:
到資料庫檢視,此處是用的navicat for mysql:
四、回滾遷移(練習操作)
如果要回滾剛才的遷移操作,可以在dos系統下使用如下命令:
php artisan migrate:rollback
如果要回滾之前多步遷移操作的話,可以在執行如下命令:
php artisan migrate:rollback --step=5 //此處5代表回滾5步遷移操作
五、全部回滾
php artisan migrate:refresh
注意:全部回滾後,資料庫所有已有資料全部清除。
六、修改資料列(欄位及其屬性,練習操作)
1. 在執行修改前,在dos下執行以下命令確保將 doctrine/dbal 依賴新增到 composer.json 中,Doctrine DBAL 庫用於判斷列的當前狀態並建立對列進行指定調整所需的 SQL 語句:
composer require doctrine/dbal
2. 建立修改遷移檔案
php artisan make:migration alter_goods_table --table=goods
3. 更新列(欄位)的屬性,使用 change() 方法:
Schema::table('goods', function ($table) {
$table->string('goods_name', 40)->change(); // 將商品名稱修改為長度限制為40
});
Schema::table('goods', function ($table) {
$table->string('goods_name', 40)->nullable()->change(); // 將商品名稱修改為允許NULL
});
注意以下資料型別是不能修改:char、double、enum、mediumInteger、timestamp、tinyInteger、ipAddress、json、jsonb、macAddress、mediumIncrements、morphs、nullableMorphs、nullableTimestamps、softDeletes、timeTz、timestampTz、timestamps、timestampsTz、unsignedMediumInteger、unsignedTinyInteger、uuid。
4. 重命令資料列,使用 renameColumn() 方法:
Schema::table('goods', function ($table) {
$table->renameColumn('num', 'number'); //修改num欄位為number
});
注意:暫時不支援 enum
型別 的列的修改和重新命名
5. 新增資料列
Schema::table('goods', function ($table) {
$table->string('look_num'); // 新增一個look_num欄位
});
6. 刪除資料列 ,使用 dropColumn() 方法:
Schema::table('goods', function ($table) {
$table->dropColumn('goods_name'); //刪除一個數據列
$table->dropColumn(['goods_name', 'goods_price', 'num']); //刪除多個數據列
});
7. 建立索引
建立索引可以有兩種方式,一種方式是在建立資料列的同時就建立索引,另一種方法是先建立資料列,然後再建立索引,如下:
Schema::create('goods', function (Blueprint $table) {
// 1. 建立資料列的同時建立唯一索引
$table->string('goods_name',60)->unique();
// 2.先建立資料列,再建立索引
$table->string('goods_name',60);
$table->unique('goods_name');
});
可用索引型別如下:
命令 | 描述 |
---|---|
$table->primary('id'); |
新增主鍵索引 |
$table->primary(['first', 'last']); |
新增混合索引 |
$table->unique('email'); |
新增唯一索引 |
$table->unique('state', 'my_index_name'); |
指定自定義索引名稱 |
$table->unique(['first', 'last']); |
新增組合唯一索引 |
$table->index('state'); |
新增普通索引 |
8. 執行遷移檔案完成修改
php artisan migrate
結語: 資料庫遷移檔案可以做資料庫結構版本控制,但是一旦有了資料,仍然還是隻進行資料庫結構版本控制,對於實際應用來說,也不能算是真正的版本控制,資料庫裡面的資料能做到版本控制,那對於利用git進行版本控制的公司和開發團隊來講,才真正算是對資料庫也進行了版本控制,資料填充參考:
相關推薦
laravel5.5資料庫遷移入門實踐
Laravel裡面對資料庫設計了一套版本控制方式——資料庫遷移,以下是個人學習入門的實踐過程。 一、生成遷移檔案 1. windows進入進入計算機dos系統,跳轉到專案根目錄,執行以下命令: (1)第一次生成遷移檔案時,需要先安裝遷移(以後操作不需要執行這一步了)
Laravel5.5 資料庫遷移:建立與修改表
資料庫遷移是資料庫的版本管理,要使用資料庫遷移,需要在.env檔案中連線好資料庫(不多說)。laravel本身已經存在user表和password_resets表的遷移了,因此,執行 php artisan migrate 便會在資料庫中建立好user表、passwo
laravel5.5資料庫之資料填充(實踐)
前要:laravel5.5資料庫遷移可以參考我的上一篇博文:laravel5.5資料庫遷移入門實踐 一、背景 常常在做專案的過程中,會使用很多的測試資料,而因為團隊開發,如果每個人的測試資料都不一致,會出現各種測試問題,所以有必要對資料庫中的測試資料也進行
最火的分散式 HTAP 資料庫 TiDB - 入門實踐教程
偶然在某篇部落格看到了 TiDB,一個融合 OLTP 和 OLAP 的分散式開源資料庫, GitHub 上 Star 很多,然後 watch 了,發現 commit 和 pull request 一直都很頻繁。 後面又看到 TiDB 在小米的應用實踐
laravel5.5 遷移資料庫 出錯(三)
錯誤提示 In Connection.php line 664: SQLSTATE[42S01]: Base table or view already exists: 1050 Table
spring boot 1.5.4 從入門到實踐
springbootSpring Boot四個重要核心:自動配置:針對很多Sping應用程序常見的應用功能,Spring Boot能自動提供相關配置;起步依賴:告訴Spring Boot需要什麽功能,它就能引入需要的庫;命令行界面:這是Spring Boot的可選特性,借此你只需寫代碼就能完成完整的應用程序,
Laravel5.5執行表遷移命令出現表為空的解決方案
今天在使用一個第三方包 laravel-admin 時,出現了這樣的錯誤: SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name '',折騰了好久,終於知道了解決方法,原來是配置檔案的快取沒有清理。
Spring+SpringMVC+MyBatis入門實踐(5)
註解方式AOP 註解配置切面 @Aspect 註解表示這是一個切面 @Component 表示這是一個bean,由Spring進行管理 @Around(value = “execution(* com.happycoder.service.ProductServ
zabbix遷移資料庫遷移 5.1-5.6
2016-07-04 23:29:20 24086 [ERROR] Native table 'performance_schema'.'table_io_waits_summary_by_index_usage' has the wrong structure 2016-07-04 23:29:20 24
Laravel5.5原始碼詳解 -- 資料庫的啟動與連線過程
Laravel5.5原始碼詳解 – 資料庫的啟動與連線過程 整個laravel的操作,一般情況下,資料庫的處理會佔掉很大一部分。所以對資料 庫處理的理解,顯得尤為重要。關於其原始碼解析,網上有非常多的文獻,但流程一般都含糊其辭,讀完來龍去脈甚為不解。所以,我自
新手學習laravel框架-laravel5.5框架入門
剛開始學習laravel框架時,我也不知道從何入手,首先就從檔案目錄開始,找到專案入口檔案,然後進行配置執行。注意:在配置執行時,要注意PHP的版本是否符合要求以及下列擴充套件是否開啟,否則執行不能成功:PHP OpenSSL 擴充套件PHP PDO 擴充套件PHP Mbst
資料庫實踐操作(二)--資料庫遷移方案
例如:開發好的銀行系統進行遷移 介紹四種方法 1>分離附加法(常當前資料庫中分離) 前提:該資料庫不處於被訪問狀態 1>開啟要分離的資料庫檔案位置 右擊資料庫屬性–檔案–複製路徑–win+R開啟路徑 注意:開啟這一
laravel5.5在第一次執行資料遷移,系統報錯(入坑)
資料遷移 * 所有建立的遷移檔案都被統一放在 database/migrations 資料夾 * Laravel 預設建立的兩個遷移檔案,一個用於構建使用者表,一個用於構建密碼重置表 * * database/migrations/2014_10_1
Laravel 實踐之路: 資料庫遷移與資料填充
資料庫遷移實際上就是對資料庫庫表的結構變化做版本控制,之前對資料庫庫表結構做修改的方式比較原始,比如說對某張庫表新增了一個欄位,都是直接在庫表中執行alter table xxx add .. 的方式直接修改,但是這麼做有些弊端,比如在開發階段,你自己的庫表修改了,還要把這
es6+最佳入門實踐(5)
code pre sig 方法 視頻教程 運算符 on() n) rip 5.對象擴展 5.1.對象簡寫 在es5中,有這樣一種寫法 var name = "xiaoqiang"; var age = 12; var obj = { name : name,
cassandra百億級資料庫遷移實踐
遷移背景 cassandra叢集隔段時間出現rt飆高的問題,帶來的影響就是請求cassandra短時間內出現大量超時,這個問題發生已經達到了平均兩週一次的頻率,已經影響到正常業務了。而出現這些問題的原因主要有以下3點: 當初設計表的時候partition key設計的不是很合理,當資料量上去(最大的單錶行數
Laravel5.x的php artisan migrate資料庫遷移建立操作報錯SQLSTATE[42000]解決
Laravel5.x執行遷移命令建立資料表:php artisan migrate報錯。 Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified
Android自己定義組件系列【5】——進階實踐(2)
col fonts tle 適配 pack tom ica void log 上一篇《Android自己定義組件系列【5】——進階實踐(1)》中對任老師的《可下拉的PinnedHeaderExpandableListView的實現》前一部分進行了實現,這一篇我們來看看Ex
【Qt入門實踐】Qt之哲學家問題(linux 多線程)
avi .cpp private 1=1 endif debug 問題 tel pub 轉載請註明出處:http://blog.csdn.net/feng1790291543 linux多線程實現哲學家問題,依據哲學家吃飯、拿筷子、放下筷子...... 首先,主
Laravel5.5執行 npm run dev時報錯,提示cross-env找不到(not found)的解決辦法
smo font span links 命令 develop ebp amp webpack Laravel 5.4 Mix & Laravel5.5執行 npm run dev時報錯,提示cross-env找不到(not found)的解決辦法 首先