我有一些问题。我想在我的表中添加新列,引用其他表中的其他列。我做了类似的事情:
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"的外键。你可以帮助我,我做错了什么?
答案 0 :(得分:0)
错误表示person
中id
的行没有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;");
}
}