Обновить таблицу с удалением старых значений - PullRequest
0 голосов
/ 09 апреля 2020

У меня очень простая таблица:

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';

Мне нужно было бы иметь возможность запустить обновление этой таблицы с различными ЗНАЧЕНИЯМИ. Например, иногда у меня было бы 3 вкладыша, иногда 6 вкладышей. Все они имеют одинаковый user_id, но комментарий изменяется. При запуске обновления старые значения должны быть сначала удалены, а новые вставлены. Вот что я пробовал:

REPLACE INTO test (
user_id,
comment
)
VALUES
(111, 'ANDROID'),
(111, 'IOS')

Этот оператор вставляет только последнее значение (IOS). Я ожидал, что у меня будут оба значения (ANDROID и IOS).

Теперь, если я выполню это:

REPLACE INTO mama (
user_id,
name
)
VALUES
(111, 'COMMODORE'),
(111, 'SINCLAIR'),
(111, 'AMIGA')

Я ожидаю иметь все три значения.

Если бы я запустил это:

REPLACE INTO test (
user_id,
name
)
VALUES
(111, 'SINCLAIR')

Я ожидал бы иметь только SINCLAIR.

Что мне нужно сделать, чтобы это произошло?

1 Ответ

3 голосов
/ 09 апреля 2020

PRIMARY ключи должны быть уникальными. Поэтому, когда вы заменяете на (111, 'IOS'), он заменяет любую существующую запись на user_id = 111, следовательно, в итоге вы получите только (111, 'IOS') в таблице. Если вы хотите вставить все значения, вам нужно удалить PRIMARY KEY на user_id (возможно, заменить его индексом). Например:

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

Вывод:

user_id     comment
111         ANDROID
111         IOS

Демонстрация на dbfiddle

Обратите внимание, что после удаления PRIMARY KEY на user_id, REPLACE становится таким же, как INSERT, поэтому вы можете вставлять одни и те же значения несколько раз. Если это не то, что вам нужно, рассмотрите ключ UNIQUE на comment:

ALTER TABLE test ADD UNIQUE (comment)

Это предотвратит дублирование комбинаций (user_id, comment).

Демонстрация на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...