Mysql 力';替换为';使用某个索引

Mysql 力';替换为';使用某个索引,mysql,Mysql,我有一个MySQL(5.0)表,其中有3行被视为组合唯一索引: CREATE TABLE `test`.`table_a` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `field1` varchar(5) COLLATE latin1_swedish_ci NOT NULL DEFAULT '', `field2` varchar(5) COLLATE latin1_swedish_ci NOT NULL DEFAULT '', `field

我有一个MySQL(5.0)表,其中有3行被视为组合唯一索引:

CREATE TABLE `test`.`table_a` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `field1` varchar(5) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `field2` varchar(5) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `field3` varchar(5) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`Id`),
  INDEX `IdxUnqiue` (`field1`(5),`field2`(5),`field3`(5))
) ENGINE=MyISAM;
此表应填写
替换为
查询:

REPLACE INTO
    table_a
(
    Field1,
    Field2,
    Field3
)
VALUES
(
    "Test1",
    "Test2",
    "Test3"
)
我想看到的行为是,这个查询总是覆盖上一个插入的行,因为
IdxUnique
是…ahm,触发的。但不幸的是,仍然有主索引似乎在起作用,并且总是插入新行

我得到的是:

Query was executed 3 times:

+---Id---+---Field1---+---Field2---+---Field3---+
| 1      | Test1      | Test2      | Test2      |
| 2      | Test1      | Test2      | Test2      |
| 3      | Test1      | Test2      | Test2      |
+--------+------------+------------+------------+
我想要的是:

Query was executed 3 times:

+---Id---+---Field1---+---Field2---+---Field3---+
| 3      | Test1      | Test2      | Test2      |
+--------+------------+------------+------------+

<> p> >我可以告诉<代码>替换为< /代码>使用一个特定的索引或考虑一个“更重要的”然后另一个?

使用<代码>索引< /Cord>关键字,您不创建一个,而是一个正常的非唯一索引。这就是为什么允许您插入非独立的行(field1、field2、field3)

因此,您只需在
CREATE TABLE
构造中将索引设置为
UNIQUE
,如下例所示:

CREATE TABLE `table_a` (
   `Id` int(11) NOT NULL AUTO_INCREMENT,
   `field1` varchar(5) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
   `field2` varchar(5) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
   `field3` varchar(5) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
   PRIMARY KEY (`Id`),
   UNIQUE `IdxUnqiue` (`field1`(5),`field2`(5),`field3`(5))
) ENGINE=MyISAM;
插入测试数据:

REPLACE INTO table_a (Field1, Field2, Field3) VALUES ("Test1", "Test2", "Test3");
REPLACE INTO table_a (Field1, Field2, Field3) VALUES ("Test1", "Test2", "Test3");
REPLACE INTO table_a (Field1, Field2, Field3) VALUES ("Test1", "Test2", "Test3");
结果:

SELECT * FROM table_a;

+----+--------+--------+--------+
| Id | field1 | field2 | field3 |
+----+--------+--------+--------+
|  3 | Test1  | Test2  | Test3  |
+----+--------+--------+--------+
1 row in set (0.01 sec)

哎呀…我错了,我只是忘了勾选方框。啊,但这是有效的…奇怪…这意味着我在我的“真实”表的某个地方有一个逻辑错误,破坏了我的索引。无论如何谢谢你!如果您没有唯一的密钥,有没有办法做到这一点。与insert类似,但如果在特定列上找到具有相同值的特定行,是否会进行更新?