Как заставить INSERT в таблицу с уникальным ключом, если он уже находится в таблице? - PullRequest
6 голосов
/ 08 ноября 2011

У меня есть таблица:

CREATE TABLE Students (studentId TEXT PRIMARY KEY, name TEXT);

Я хочу вставить записи в таблицу, если я вставлю студента дважды, я хочу вторая вставка для переопределения (обновления) первой записи.

INSERT INTO Students (StudentId, name) VALUES ('123', 'Jones');
INSERT INTO Students (StudentId, name) VALUES ('123', 'Jonas');

Какой лучший способ сделать это?

Ответы [ 4 ]

8 голосов
/ 08 ноября 2011

Попробуйте REPLACE:

REPLACE INTO Students (StudentId, name) VALUES ('123', 'Jonas');

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет такое же значение, как новаяPRIMARY KEY или UNIQUE index, старая строка удаляется перед вставкой новой строки.

6 голосов
/ 08 ноября 2011

Вы также можете использовать синтаксис INSERT ... ON DUPLICATE KEY UPDATE:

INSERT INTO Students
    (StudentId, name) 
  VALUES ('123', 'Jones')
ON DUPLICATE KEY UPDATE
  name = VALUES(name) ;

Смотрите этот ответ: insert-ignore-vs-insert-on-duplicate-update-101 * * для различий между REPLACE, INSERT ... ON DUPLICATE KEY UPDATE и INSERT IGNORE.


Но, пожалуйста, скажите нам, что studentId TEXT PRIMARY KEY является опечаткой. У вас действительно есть первичный ключ с типом TEXT? Название (studentId) предполагает, что это может быть просто INT или INT AUTO_INCREMENT.

5 голосов
/ 08 ноября 2011

Если вы используете MySql - просто используйте REPLACE вместо INSERT

0 голосов
/ 13 января 2018

Извините, что воскресил это, но у меня была похожая проблема, но с таблицей, в которой уже были данные, и без внешних ключей, поэтому мое решение было очень простым, мне пришлось добавить новый столбец с именем "temp_id" ипервичный ключ, затем удалите старый столбец идентификатора, а затем переименуйте столбец «temp_id» в «id».

...