2016-12-07 84 views
1

我有一些问题。我想添加新的列到我的表中引用其他表中的其他列。我做这样的事情:将外键列添加到表中。

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;"); 
    } 

} 

但是当我尝试执行此迁移我有此错误:

Foreign key violation: 7 DETAIL: Key (administrator)=(15) doesn't appear in table "person"..

我知道,有没有在我的表列吸“管理员”。但我想添加新的列“管理员”到贷款表中。我想从人员表,列“id”中创建“管理员”外键。你能帮助我吗?我做错了什么?

回答

0

该错误意味着person中没有行,id等于15,这将满足约束条件。

当您运行ALTER TABLE声明,该表已被改写,新中填入值15

往往是更容易地创建一个新的列可空,没有默认值(当时ALTER TABLE将不会重写表格)并使用UPDATE来填充新列。之后,您可以将列定义更改为NOT NULL并添加默认值。

+0

但有行的人,ID为15.这是PK在此表中,并与该ID即时通讯的人。而这个人PK应该是FK贷款。 – Speedvees

+0

你一定犯了错误。错误消息毫无疑问地表明,在'ALTER TABLE'运行时,没有'person'有'id' 15.你看错了数据库吗?在不同的模式中是否有多个表格“person”? –

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;"); 
    } 
}