首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除旧值的更新表

删除旧值的更新表
EN

Stack Overflow用户
提问于 2020-04-09 09:00:52
回答 1查看 30关注 0票数 0

我有张很简单的桌子:

代码语言:javascript
复制
CREATE TABLE `test` (
  `user_id` int(11) NOT NULL,
  `comment` varchar(45) NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='no';

我需要能够使用各种值运行update这个表。例如,有时我会,3插入,有时6插入。它们都有相同的user_id,但是注释会发生变化。运行更新时,应首先删除旧值,并插入新值。这就是我尝试过的:

代码语言:javascript
复制
REPLACE INTO test (
user_id,
comment
)
VALUES
(111, 'ANDROID'),
(111, 'IOS')

此语句仅插入最后一个值(IOS)。我的期望是同时拥有两种价值观(ANDROID和IOS)。

现在如果我运行这个:

代码语言:javascript
复制
REPLACE INTO mama (
user_id,
name
)
VALUES
(111, 'COMMODORE'),
(111, 'SINCLAIR'),
(111, 'AMIGA')

我希望拥有这三种价值观。

如果我运行这个:

代码语言:javascript
复制
REPLACE INTO test (
user_id,
name
)
VALUES
(111, 'SINCLAIR')

我希望只有辛克莱。

我需要做些什么才能让它发生?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-09 09:14:47

PRIMARY必须是唯一的。因此,当您用(111, 'IOS')替换时,它将任何现有条目替换为user_id = 111,因此最终只能在表中得到(111, 'IOS')。如果要插入所有值,则需要删除PRIMARY KEY on user_id (也许可以用索引替换它)。例如:

代码语言:javascript
复制
ALTER TABLE test DROP PRIMARY KEY;
ALTER TABLE test ADD INDEX (user_id);
REPLACE INTO test (
user_id,
comment
)
VALUES
(111, 'ANDROID'),
(111, 'IOS');

SELECT *
FROM test

输出:

代码语言:javascript
复制
user_id     comment
111         ANDROID
111         IOS

dbfiddle演示

请注意,一旦移除user_id上的user_idREPLACE将与INSERT相同,因此可以多次插入相同的值。如果这不是您想要的,请考虑在UNIQUE上使用comment

代码语言:javascript
复制
ALTER TABLE test ADD UNIQUE (comment)

这将防止重复的(user_id, comment)组合。

dbfiddle演示

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61117490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档