Postgresql 将带有外键的列添加到表中。
我有一些问题。我想在我的表中添加引用其他表中其他列的新列。我会这样做:Postgresql 将带有外键的列添加到表中。,postgresql,migration,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
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)未出现在表“person”中
我知道我的表中没有“administrator”列。但我想在loan表中添加新的列“administrator”。我想从person表的“id”列中生成“administrator”外键。你能帮我一下吗,我做错了什么?这个错误意味着
person
中没有id
等于15的行,这是满足约束所必需的
当您运行altertable
语句时,必须重写该表,并且新列将填充值15
通常,创建一个可为空且没有默认值的新列(然后
altertable
将不会重写该表)并使用UPDATE
填充新列更容易。之后,您可以将列定义更改为notnull
,并添加默认值。该错误意味着person
中没有id
等于15的行,这是满足约束所必需的
当您运行altertable
语句时,必须重写该表,并且新列将填充值15
通常,创建一个可为空且没有默认值的新列(然后altertable
将不会重写该表)并使用UPDATE
填充新列更容易。之后,您可以将列定义更改为非空
,并添加默认值。尝试此操作
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;");
}
}
试试这个
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;");
}
}
但有一行的id等于15。这是这个表中的PK,我是这个id的人。这个PK来自于贷款中应该是FK的人。你一定搞错了。错误消息毫无疑问地指出,在运行
ALTER TABLE
时,没有person
拥有id
15。你查错数据库了吗?在不同的模式中是否有多个表person
?但person中有一行id等于15。这是这个表中的PK,我是这个id的人。这个PK来自于贷款中应该是FK的人。你一定搞错了。错误消息毫无疑问地指出,在运行ALTER TABLE
时,没有person
拥有id
15。你查错数据库了吗?在不同的模式中是否有多个表person
?