如何在Laravel迁移中安全地将不可为空的列添加到现有表中?

时间:2018-09-13 20:53:34

标签: php sql laravel postgresql migration

我想在Laravel迁移中向现有表添加一个不可为空的列,其中包含一些行。 在SQL中,我知道应该在事务内部按以下顺序执行该操作

  1. 添加列
  2. 初始化列
  3. 使其不可为空

以保证

  • 在不破坏数据库完整性的情况下执行初始化,并且
  • ALTER TABLE不违反NOT NULL约束,

以下是PostgreSQL示例代码(假设users表具有列old_col),引用了an answer

BEGIN TRANSACTION;
  ALTER TABLE users ADD COLUMN new_col integer;
  UPDATE users SET new_col = old_col + 1;
  ALTER TABLE users ALTER COLUMN new_col SET NOT NULL;
COMMIT;

像这样的普通Laravel迁移文件不起作用。

public function up()
{
    Schema::table('users', function($table) {
        $table->integer('new_col');  // ->nullable(false) // later?
    });
}

如何在Laravel迁移中实现SQL事务或等效事务?

注意(已编辑)
如果要设置默认值(如果不需要(绝对同时)更新现有行的列作为每行某些值的函数,则只需指定->default(0)或迁移文件中的类似内容(并避免所有花招!)。我要问的目的不是为要添加的列设置默认值。

1 个答案:

答案 0 :(得分:0)

您可以在foreach中编写代码,例如$ methodName ='item-> get'。$ method。'()';

课程项目{

getFoo(); ...

getBar(); ...

}

$ methods = ['Foo','Bar'];

foreach($ methods as $ method){

$ methodName ='item-> get'。$ method。'()';

echo $ methodName;

}