MySQL:唯一和索引等价

时间:2010-11-29 14:59:34

标签: mysql

我创建了一个使用Hibernate ORM的Java应用程序,使用Hibernate工具我得到一个自动脚本,用于从用作实体的Java对象安装或升级数据库模式。

该程序在MySQL中正常工作,但是对于Oracle,当在一列中声明约束“unique”并且在尝试定义索引之后触发错误。 Oracle表示默认情况下“唯一”约束会创建一个索引,因此无法声明同一列上的两个索引,

所以,我的问题是,如果在MySQL中,唯一约束和一个索引之间存在等价或关系。

请澄清。提前致谢。

2 个答案:

答案 0 :(得分:0)

MySQL只是不关心无用的索引。对于更新,它将检查所有唯一索引,对于SELECT,它将选择任意索引。

因此,为了让Oracle满意,请在创建唯一索引之前删除索引。

答案 1 :(得分:0)

唯一约束需要索引才能强制执行。当您将列声明为唯一时,两个DBMS都会创建适当的索引。唯一的区别是Oracle阻止您创建冗余索引,但MySQL不会:

show index from test_table;

+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table      | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| test_table |          0 | PRIMARY    |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| test_table |          0 | foo_unique |            1 | foo         | A         |           0 |     NULL | NULL   |      | BTREE      |         |
| test_table |          1 | foo_key    |            1 | foo         | A         |           0 |     NULL | NULL   |      | BTREE      |         |
+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+