我试图测试插入重复键的工作方式。目前这就是我所做的:
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进行了检查