sqlite上的重复索引,而不是mysql

Posted

技术标签:

【中文标题】sqlite上的重复索引,而不是mysql【英文标题】:Duplicate index on sqlite, not on mysql 【发布时间】:2014-12-01 22:02:50 【问题描述】:

我有一个适用于开发和生产环境 (mysql) 的实体定义,但不适用于测试 (sqlite):

/**
 * 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
// [...]

当我在测试环境上运行教义:架构:创建或教义:架构:更新 --force 时,出现以下错误:

  [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 

有人已经遇到过这种问题吗?如何解决/忽略它?

谢谢。

【问题讨论】:

只是一个想法。但是两个 DBMS 之间的一个区别是 SQLITE 都是文本,所有列基本上都包含字符串数据。可能您有一些在文本中“不同”但不是其他格式的值。想不出真的很好的例子,但是像“123”和“0123”在文本中不同,但在 INT 列中不同。 我注意一定明白。你的意思是如果我在另一个实体的某个地方有另一个created_at_ids,sqlite 可能会失败? 对不起!我回答了欺骗行,只是从您的评论中意识到问题是欺骗索引本身。所以是的,我相信如果数据库上已经有一个名为 created_at_idx 的对象,无论与该表的关联如何,它都会失败。但是对于大多数 DBMS 来说,这将是正确的,所以仍然不确定除了一个杂散的名称之外,这两个 DBMS 之间的行为会有什么不同。看看是否存在(我认为是“SELECT * FROM my_db_name.sqlite_master where name = 'created_at_ids'”)。抱歉,无法提供更多帮助。 感谢您的回答。我会调查并等待其他帮助。 :) 【参考方案1】:

解决办法在这里:https://***.com/a/24634713/1731473

简而言之,您的索引必须在您的数据库中有一个唯一的名称。

所以你不能拥有:

发票 -> created_at_idx 用户 -> created_at_idx

但是:

invoive -> invoice_created_at_idx 用户 -> user_created_at_idx

【讨论】:

以上是关于sqlite上的重复索引,而不是mysql的主要内容,如果未能解决你的问题,请参考以下文章

sqlite 怎么知道索引在哪个索引btree里

在应用于列的函数上创建索引:适用于一个安装,而不是另一个

MySQL处理重复键错误插入具有多个唯一索引的表;不是多列唯一索引

MySQL唯一索引有重复值且不是bug的场景

mysql “索引”能重复吗?“唯一索引”与“索引”区别是啥?

mysql 利用唯一索引Unique 高并发创建不重复唯一订单号是不是和兴?