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的主要内容,如果未能解决你的问题,请参考以下文章
MySQL处理重复键错误插入具有多个唯一索引的表;不是多列唯一索引