2014-12-01 48 views
2

我有在開發和生產ENVS(MySQL的)工作的實體定義,但不是在測試(源碼):對sqlite的複製指數,而不是MySQL的

/** 
* Invoice 
* 
* @ORM\Table(name="invoice", indexes={ 
*  @ORM\Index(name="ref_idx", columns={"ref"}), 
*  @ORM\Index(name="created_at_idx", columns={"created_at"}), 
*  @ORM\Index(name="paid_idx", columns={"paid"}), 
*  @ORM\Index(name="is_valid_idx", columns={"is_valid"}), 
*  @ORM\Index(name="canceled_idx", columns={"canceled"}) 
* }) 
* @ORM\Entity(repositoryClass="AppBundle\Repository\InvoiceRepository") 
*/ 
class Invoice 
// [...] 

當我運行學說:模式:創建或原則:架構:更新 - 測試環境env,我有以下錯誤:

[Doctrine\DBAL\DBALException]                 
    An exception occurred while executing 'CREATE INDEX created_at_idx ON invoice (created_at)': 
    SQLSTATE[HY000]: General error: 1 index created_at_idx already exists       


    [PDOException]               
    SQLSTATE[HY000]: General error: 1 index created_at_idx already exists 

是否有人已經有這種問題?如何解決/忽略它?

謝謝。

+0

只是一個想法。但兩個DBMS之間的一個區別是SQLITE是全部文本,所有列基本上都包含字符串數據。可能你有一些文本中的「不同」但不是另一種格式的值。不能認爲如果真的很好的例子,但像「123」和「0123」在文本中不同,但不在INT列中。 – asantaballa 2014-12-01 22:11:17

+0

我記得一定要明白。你的意思是如果我在另一個實體的某處有另一個'created_at_ids',sqlite可能會失敗? – Soullivaneuh 2014-12-01 22:18:24

+0

對不起!我對dupe行進行了回答,並從您的評論中發現,問題在於dupe索引本身。所以是的,我相信如果數據庫中已經有一個名爲created_at_idx的對象,無論與此表關聯,它都會失敗。但是對於大多數DBMS來說這是事實,所以仍然不確定除了只是一個流浪的名字之外,兩個DBMS之間的行爲差​​異是什麼。看看是否存在(我認爲是「SELECT * FROM my_db_name.sqlite_master where name ='created_at_ids'」)。抱歉不能有更多的幫助。 – asantaballa 2014-12-01 22:49:55

回答

11

解決方案是在這裏:https://stackoverflow.com/a/24634713/1731473

概括地說,你的指數應跨越你的數據庫有唯一的名稱

所以你不能有:

發票 - > created_at_idx 用戶 - > created_at_idx

但是:

invoive - > invoice_created_at_idx 用戶 - > user_created_at_idx

相關問題