插入..选择..重复键更新

时间:2014-12-01 21:37:49

标签: mysql insert-into on-duplicate-key

我试图测试插入重复键的工作方式。目前这就是我所做的:

INSERT INTO
user_test (userName, first, last)

SELECT
u.userName, u.first, u.last
FROM otherdatabase.user as u

ORDER BY u.userName ASC

ON DUPLICATE KEY UPDATE
userName = u.userName

我执行了这个查询,它工作并插入行。然后我做的是我从用户表中修改了一行,然后再次尝试运行此查询,但不是只更新那一行,而是再次插入所有行。

根据我的理解,它不应该只更新我从用户表中修改过的那一行吗?

我要做的是做一个"如果它不存在则插入并且如果它存在则更新"查询并发现使用insert into .. on duplicate key可以做到这一点,但我显然做错了...

CREATE TABLE user_test (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  userName varchar(20) DEFAULT NULL,
  first varchar(20) DEFAULT NULL,
  last varchar(20) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=latin1 

Per Barranka的建议我在user_name列中添加了一个唯一索引

Alter table user_test add unique index idx_userName(userName)

然后我再次运行查询,因为它已经存在,所以它不再添加任何行。 这是user_table现在的样子的一个例子,现在在用户表上是相同的。

USER_TABLE:

userName    |   first   |   last    |
ckeith      |   Carl    |   Keith   |
mmonroe     |   Mickey  |   Monroe  |

然后我再次测试它是从用户表中修改了其中一行

用户:

userName    |   first   |   last    |
ckeithh     |   Carl    |   Keith   |
mmonroe     |   Mickey  |   Monroe  |

再次执行查询,这就是users_table的样子:

USER_TABLE:

userName    |   first   |   last    |
ckeith      |   Carl    |   Keith   |
mmonroe     |   Mickey  |   Monroe  |
ckeithh     |   Carl    |   Keith   |

我认为它只会将第一行更新为ckeithh但它只插入一行? 我的预期输出是:

USER_TABLE:

userName    |   first   |   last    |
ckeithh     |   Carl    |   Keith   |
mmonroe     |   Mickey  |   Monroe  |

更新:

我添加了一个唯一索引,并确保它是唯一的。插入工作但现在更新无效。还有什么我应该尝试的吗?


仍然无法让这个工作,我已经确认我使用的专栏是唯一的,我的mysql版本是v5(我在其中一个论坛上看到,为了这个工作,mysql应该是v5,不确定这是否真实,但我仍然使用v5.5.37进行了检查

0 个答案:

没有答案