Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何将一个FK添加到多个可以为null的FK中_Mysql - Fatal编程技术网

Mysql 如何将一个FK添加到多个可以为null的FK中

Mysql 如何将一个FK添加到多个可以为null的FK中,mysql,Mysql,我正在尝试两个实体a和B之间的manyTone的基本关系。实体a已经声明,因此实际迁移包含实体B的创建以及为了接受外键而对a的更改。我在这里也有一个问题:有一个bigint的PK,错误为不能添加外键 修正了这个问题,只有当我同时删除实体A并基本上从头开始创建它们时,它才起作用。 我的代码和迁移仅创建了B并更改了A,但仍然会导致错误: 不知何故,我希望A中的FK也接受可为null的值,我认为问题在于: 这是第一次迁移: CREATE TABLE A(id BIGINT UNSIGNED AUTO

我正在尝试两个实体a和B之间的manyTone的基本关系。实体a已经声明,因此实际迁移包含实体B的创建以及为了接受外键而对a的更改。我在这里也有一个问题:有一个bigint的PK,错误为不能添加外键

修正了这个问题,只有当我同时删除实体A并基本上从头开始创建它们时,它才起作用。 我的代码和迁移仅创建了B并更改了A,但仍然会导致错误: 不知何故,我希望A中的FK也接受可为null的值,我认为问题在于:

这是第一次迁移:

CREATE TABLE
 A(id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
 name VARCHAR(255) NOT NULL,
 description VARCHAR(255) NOT NULL,
 value VARCHAR(255) NOT NULL,
 datatype VARCHAR(255) NOT NULL,
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB
现在根据我的代码生成以下查询:

CREATE TABLE 
 B(id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
 name VARCHAR(255) NOT NULL,
 code INT UNSIGNED NOT NULL,
 UNIQUE INDEX code_idx (code),
 PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB
以及:

但是当我运行迁移时,A表中没有列。我真的很困惑,不知道该怎么解决这个问题。有人有线索吗

编辑:

我在实体中的代码是:

class A:

/**
 * @var B
 *
 * @ORM\ManyToOne(targetEntity="App\Model\B", inversedBy="aS")
 * @ORM\JoinColumn(name="id", referencedColumnName="id")
 */
private $bId;

class B:
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="bigint", nullable=false, options={"unsigned": true})
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @ORM\OneToMany(targetEntity="App\Model\A", mappedBy="bid")
 */
private $aS;

你的映射有点瑕疵或者你真的打算这样做 这是您的代码修复

这是首选的解决方案

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="a")
 * @ORM\Entity(repositoryClass="App\Repository\ARepository")
 */
class A
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="bigint", options={"unsigned": true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="auto")
     */
    private $id;

    /**
     * @var B
     *
     * @ORM\ManyToOne(targetEntity="B", inversedBy="aS")
     * @ORM\JoinColumn(name="b_id", referencedColumnName="id")
     */
    private $b;
}

在A实体中,实际上映射的是对象B而不是其ID

您的ALTER表在逻辑上是错误的。您尝试将一个主键引用到另一个主键。1每个主键都是唯一的,因此您可以获得一对一,而不是一对多。2该表无法通过自动递增字段引用另一个表。请将字段添加到表a结构中并将其引用到表B,如ALTER table a Add COLUMN table_B_id BIGINT UNSIGNED NOT NULL、Add CONSTRAINT FK_D1DD32EBBF396750外键表_B_id引用B id。我添加了编辑。基本上,这是我的代码,生成的查询是由条令生成的。@Akina我已经按照你的建议做了,它正在工作,但我不确定如何在条令代码中转换此代码以生成查询。.关于条令,我只知道它存在。
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="a")
 * @ORM\Entity(repositoryClass="App\Repository\ARepository")
 */
class A
{
    /**
     * @var B
     *
     * @ORM\ManyToOne(targetEntity="B", inversedBy="aS")
     * @ORM\JoinColumn(name="id", referencedColumnName="id")
     * @ORM\Id
     */
    private $bId;
}
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="a")
 * @ORM\Entity(repositoryClass="App\Repository\ARepository")
 */
class A
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="bigint", options={"unsigned": true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="auto")
     */
    private $id;

    /**
     * @var B
     *
     * @ORM\ManyToOne(targetEntity="B", inversedBy="aS")
     * @ORM\JoinColumn(name="b_id", referencedColumnName="id")
     */
    private $b;
}