2

我对推进中的外键有疑问。我的项目中有 2 个模式与 2 个物理数据库匹配:我的本地数据库(数据库一)和带有一些只读信息的远程数据库(数据库二)

关键是我需要设置一个从 DB One 到 DB 2 的外键,但它不起作用。这是我的模式:

模式 1

<database package="dbOne" defaultIdMethod="native" name="dbOne">
  <table name="tableOne">
    <column name="pk_tableOne" type="INTEGER" primaryKey="true" required="true" autoIncrement="true"/>
    <column name="column_one" type="DOUBLE" required="true"/>
    <foreign-key name="fk_column_one" foreignTable="tableTwo" foreignSchema = "dbTwo">
      <reference local="column_one" foreign="column_two"/>
    </foreign-key>
      </table>
</database>

模式 2

<database package="dbTwo" defaultIdMethod="native" name="dbTwo">
  <table name="tableTwo">
    <column name="column_two" type="DOUBLE" primaryKey="true" required="true"/>
</database>

我已经使用两个数据源设置了 runtime/build-conf.xml,在 om/diff 命令期间我收到了这个错误:

由于以下原因,目标“om-template”的执行失败:“tableOne”包含不存在的表“dbTwo.tableTwo”的外键

我究竟做错了什么?

4

2 回答 2

1

不幸的是,我认为您无法为不同数据库上的表设置外键引用。如果您查看生成器文件,我们会看到这一行:

当前 github 版本propel/generator/lib/model/Table.php中的第 901 行:

public function setupReferrers($throwErrors = false)
{
  foreach ($this->getForeignKeys() as $foreignKey) {

    // table referrers
    $foreignTable = $this->getDatabase()->getTable($foreignKey->getForeignTableName());
    if ($foreignTable !== null) {
      ...
    } elseif ($throwErrors) {
      throw new BuildException(sprintf(
        'Table "%s" contains a foreign key to nonexistent table "%s"',
        $this->getName(),
        $foreignKey->getForeignTableName()
      ));
    }
    ...
  }
  ...
}

关键是它所说$foreignTable = $this->getDatabase()...的,换句话说,它只适用于对该表自己的数据库的引用。我建议将您的声音添加到这个 github 问题中,这似乎是您所要求的。

于 2013-02-04T16:15:55.510 回答
0

您不能加入外部数据库。但是:如果您的数据库支持它(您需要像 PGSQL 这样的数据库),您可以将表放在同一个数据库中的不同模式中。这为您提供了相同的表分离,但能够应用连接(和设置外键)。

于 2013-09-20T09:38:39.957 回答