【问题标题】:An index with name 'primary' was already defined on table 'sites'表 'sites' 上已定义名称为 'primary' 的索引
【发布时间】:2016-04-16 19:07:51
【问题描述】:

我将 Doctrine 2 与 ZF2 一起使用。

我有一个带有以下主键字段的站点实体。

/**
 * @var string
 * @ORM\Column(name="site_id", type="string", length=10, nullable=false)
 * @ORM\Id
 */
private $siteId;

还有以下索引的

*   @ORM\Table(name="sites", indexes={
*   @ORM\Index(name="PRIMARY", columns={"site_id"}),
*   @ORM\Index(name="country_id", columns={"country_id"}),
*   @ORM\Index(name="timezone_id", columns={"timezone_id"}),
*   @ORM\Index(name="vat_rate_id", columns={"vat_rate_id"}),
*   @ORM\Index(name="site_mode_id", columns={"site_mode_id"}),
*   @ORM\Index(name="created_by_user_id", columns={"created_by_user_id"}),
* })

当我从命令行运行 php ./vendor/doctrine/doctrine-module/bin/doctrine-module orm:validate-schema 时,我收到以下错误消息。

[Doctrine\DBAL\Schema\SchemaException]
  An index with name 'primary' was already defined on table 'sites'.

但它也报告The mapping files are correct.

有谁知道为什么会产生这个错误?

非常感谢。

编辑

请求的完整实体

/**
 * Sites Entity
 *
 * @author Garry Childs
 *
 *   @ORM\Table(name="sites", indexes={
 *   @ORM\Index(name="country_id", columns={"country_id"}),
 *   @ORM\Index(name="timezone_id", columns={"timezone_id"}),
 *   @ORM\Index(name="vat_rate_id", columns={"vat_rate_id"}),
 *   @ORM\Index(name="site_mode_id", columns={"site_mode_id"}),
 *   @ORM\Index(name="created_by_user_id", columns={"created_by_user_id"}),
 * })
 * @ORM\Entity(repositoryClass="Application\Entity\Repository\SitesRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Sites extends AbstractEntity
{

    /**
     * @var string
     * @ORM\Column(name="site_id", type="string", length=10, nullable=false)
     * @ORM\Id
     */
    private $siteId;

    /**
     * @var string
     *
     * @ORM\Column(name="domain_name", type="string", length=255, nullable=false)
     */
    private $domainName;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=30, nullable=false)
     */
    private $title;

    /**
     * @var string
     *
     * @ORM\Column(name="email_address", type="string", length=254, nullable=false)
     */
    private $emailAddress;

    /**
     * @var string
     *
     * @ORM\Column(name="layout", type="string", length=30, nullable=true)
     */
    private $layout;

    /**
     * @var string
     *
     * @ORM\Column(name="homepage", type="string", length=30, nullable=true)
     */
    private $homepage;

    /**
     * @var string
     *
     * @ORM\Column(name="bookmark_icon", type="string", length=20, nullable=false)
     */
    private $bookmarkIcon = 'bookmark.png';

    /**
     * @var string
     *
     * @ORM\Column(name="address", type="string", length=200, nullable=false)
     */
    private $address;

    /**
     * @var string
     *
     * @ORM\Column(name="town", type="string", length=30, nullable=false)
     */
    private $town;

    /**
     * @var string
     *
     * @ORM\Column(name="county", type="string", length=30, nullable=false)
     */
    private $county;

    /**
     * @var \Application\Entity\Countries
     *
     * @ORM\ManyToOne(targetEntity="Application\Entity\Countries")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="country_id", referencedColumnName="country_id")
     * })
     */
    private $country;

    /**
     * @var string
     *
     * @ORM\Column(name="post_code", type="string", length=7, nullable=false)
     */
    private $postCode;

    /**
     * @var \Application\Entity\Timezones
     *
     * @ORM\ManyToOne(targetEntity="Application\Entity\Timezones")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="timezone_id", referencedColumnName="timezone_id")
     * })
     */
    private $timezone;

    /**
     * @var string
     *
     * @ORM\Column(name="locale", type="string", length=5, nullable=false)
     */
    private $locale;

    /**
     * @var string
     *
     * @ORM\Column(name="currency_code", type="string", length=3, nullable=false)
     */
    private $currencyCode;

    /**
     * @var string
     *
     * @ORM\Column(name="vat_number", type="string", length=10, nullable=true)
     */
    private $vatNumber;

    /**
     * @var \Application\Entity\VatRates
     *
     * @ORM\ManyToOne(targetEntity="Application\Entity\VatRates", inversedBy="sites")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="vat_rate_id", referencedColumnName="vat_rate_id")
     * })
     */
    private $vatRate;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_created", type="datetime")
     */
    private $dateCreated;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_modified", type="datetime")
     */
    private $dateModified;

    /**
     * @var \Application\Entity\Users
     *
     * @ORM\ManyToOne(targetEntity="Application\Entity\Users")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="created_by_user_id", referencedColumnName="user_id")
     * })
     */
    private $createdBy;

    /**
     * @var Doctrine\ORM\PersistentCollection
     *
     * @ORM\OneToMany(targetEntity="Application\Entity\Categories", mappedBy="site")
     */
    private $categories;

    /**
     * @var \Doctrine\ORM\PersistentCollection
     *
     * @ORM\OneToMany(targetEntity="Application\Entity\SiteCountries", cascade="persist", mappedBy="site")
     */
    private $siteCountries;

    /**
     * @var \Doctrine\ORM\PersistentCollection
     *
     * @ORM\OneToMany(targetEntity="Application\Entity\SiteShippingMethods", cascade="persist", mappedBy="site")
     */
    private $shippingMethods;

    /**
     * @var \Doctrine\ORM\PersistentCollection
     *
     * @ORM\OneToMany(targetEntity="Application\Entity\SitePaymentMethods", cascade="persist", mappedBy="site")
     */
    private $sitePaymentMethods;

    /**
     * @var \Application\Entity\SiteModes
     *
     * @ORM\ManyToOne(targetEntity="Application\Entity\SiteModes")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="site_mode_id", referencedColumnName="site_mode_id")
     * })
     */
    private $siteMode;

    /**
     *
     * @var integer
     * @ORM\Column(name="payment_days", type="integer", nullable=false)
     */
    private $paymentDays;

    /**
     *
     * @var integer
     * @ORM\Column(name="products_per_page", type="integer", nullable=false)
     */
    private $productsPerPage;

    /**
     * @var \Doctrine\ORM\PersistentCollection
     *
     * @ORM\OneToMany(targetEntity="Application\Entity\Invoices", mappedBy="site")
     * })
     */
    private $invoices;

    public function __construct()
    {
        $this->categories = new ArrayCollection();
        $this->siteCountries = new ArrayCollection();
        $this->shippingMethods = new ArrayCollection();
        $this->vatRate = NULL;
        $this->sitePaymentMethods = new ArrayCollection();
        $this->invoices = new ArrayCollection();
        $this->productsPerPage = 15;
    }

    .... Getters & Setters

    /**
     * @ORM\PrePersist
     * @return \Application\Entity\Users
     */
    public function prePersist()
    {
        $this->dateCreated = $this->getCurrentDateTime();
        $this->dateModified = $this->getCurrentDateTime();
        $this->currencyCode = $this->strToUpper($this->currencyCode);
        $this->createdBy = $this->getAuthUser();
        return $this;
    }

    /**
     * @ORM\PreUpdate
     * @return \Application\Entity\Users
     */
    public function preUpdate()
    {
        $this->dateModified = $this->getCurrentDateTime();
        $this->currencyCode = $this->strToUpper($this->currencyCode);
        return $this;
    }

【问题讨论】:

  • 那是因为名称被识别为 sql 关键字。尝试在字符串 name="`PRIMARY`" 周围添加反引号
  • 感谢您的回复。我试过反引号 PRIMARY 没有运气,仍然得到同样的错误。
  • bcz 名称 PRIMARY 是 MYSQL RESERVED 关键字,总之你的错误有你的答案
  • 我刚刚删除了* @ORM\Index(name="PRIMARY", columns={"site_id"}),这一行,但仍然遇到同样的错误。
  • @Garry 你的AbstractEntity里面有什么?您是否已经在那里声明了主键或标识符?

标签: php orm doctrine-orm zend-framework2


【解决方案1】:

当您将@ORM\Id 注释添加到$siteId 属性时,您已经将site_id 列标记为主要列。无需添加以下行:

@ORM\Index(name="PRIMARY", columns={"site_id"}),

删除该行,您将看到site_id 列将在您的数据库中自动正​​确索引为PRIMARY 索引。

在教义文档中阅读更多关于 in chapter 4.5. Identifiers / Primary Keys 的信息

【讨论】:

  • 我删除了 * @ORM\Index(name="PRIMARY", columns={"site_id"}), 行,但仍然遇到同样的错误。
  • 按要求向问题添加了实体定义。
  • 刚刚在 ZF3 项目中遇到了同样的问题,所以我按照@Wilt 的建议进行操作,因此将答案标记为正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 2021-03-24
  • 2020-11-01
  • 2020-09-03
  • 2023-02-07
  • 2022-08-22
  • 1970-01-01
相关资源
最近更新 更多