将带外键的列添加到表中。

时间:2016-12-07 14:10:31

标签: postgresql migration

我有一些问题。我想在我的表中添加新列,引用其他表中的其他列。我做了类似的事情:

class m161202_153033_dodanie_informacji_o_obsludze_prawnej_do_pozyczki extends CDbMigration
{
    public function safeUp()
    {
            $this->execute("ALTER TABLE loan ADD COLUMN administrator int NOT NULL DEFAULT 15 REFERENCES person (id) ON UPDATE CASCADE ON DELETE NO ACTION;");
    }

    public function safeDown()
    {
            $this->execute("ALTER TABLE loan DROP COLUMN administrator;");
    }

}

但是当我尝试执行此迁移时出现此错误:

  

外键违规:7   详细信息:密钥(管理员)=(15)不会出现在表格中#34; person" ..

我知道没有吸吮专栏"管理员"在我的桌子上。但我想添加新专栏" administrator"进入贷款表。我想让#34;管理员"来自人员表,列" id"的外键。你可以帮助我,我做错了什么?

2 个答案:

答案 0 :(得分:0)

错误表示personid的行没有ALTER TABLE等于15,这是满足约束所必需的。

当您运行ALTER TABLE语句时,必须重写该表,并使用值15填充新列。

通常可以更容易地创建一个可空的新列并且没有默认值(然后UPDATE将不会重写该表)并使用NOT NULL填充新列。之后,您可以将列定义更改为(define (f n) (if (< n 3) n (+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3)))))) 并添加默认值。

答案 1 :(得分:0)

试试这个

class m161202_153033_dodanie_informacji_o_obsludze_prawnej_do_pozyczki extends CDbMigration
{
    public function safeUp()
    {
            $this->execute("INSERT INTO person (id) VALUES (15) ON CONFLICT (id) DO NOTHING;");
            $this->execute("ALTER TABLE loan ADD COLUMN administrator int NOT NULL DEFAULT 15 REFERENCES person (id) ON UPDATE CASCADE ON DELETE NO ACTION;");
    }

    public function safeDown()
    {
            $this->execute("ALTER TABLE loan DROP COLUMN administrator;");
    }
}