mySQL Insert Into с помощью Select

У меня есть таблица рабочего процесса, в которой есть данные patient_id, pat_firstname, pat_lastname. Я хочу извлечь эти данные в таблицу пациентов.

INSERT INTO patients (patient_id, first_name, last_name)
SELECT DISTINCT patient_id, pat_firstname, pat_lastname
FROM workflow

Проблема, с которой я столкнулся, заключается в том, что это не работает, потому что Patient_id является первичным ключом в таблице пациентов, а некоторые поля first_name или last_name не совпадают, поэтому есть попытки вставить дубликаты.

Я хочу просто использовать любую запись из таблицы рабочего процесса для first_name и last_name. Например, если есть:

patient_id = 2 pat_first_name = Kris pat_last_name = Doman

patient_id = 2 pat_first_name = Kristofer pat_last_name = Doman

Я хочу вставить любую запись, это не имеет значения. Как я могу сделать это с помощью одного оператора вставки?


person Kristofer Doman    schedule 30.10.2013    source источник


Ответы (2)


У вас есть два варианта:

используйте INSERT IGNORE: это не изменит уже существующие значения

INSERT IGNORE INTO patients (patient_id, first_name, last_name)
SELECT DISTINCT patient_id, pat_firstname, pat_lastname
FROM workflow

или вы можете использовать REPLACE: это либо вставит, либо обновит данные.

REPLACE INTO patients (patient_id, first_name, last_name)
SELECT DISTINCT patient_id, pat_firstname, pat_lastname
FROM workflow

Если сохранение ресурсов имеет значение, REPLACE не рекомендуется.

проверьте документацию mysql для получения подробной информации о INSERT UPDATE и REPLACE

person Asenar    schedule 30.10.2013
comment
Я не понимаю, о чем вы говорите. Не могли бы вы привести примеры каждого из них? - person Kristofer Doman; 30.10.2013
comment
Это действительно отлично работает с REPLACE :) Я не знал, что это существует, спасибо! - person Kristofer Doman; 30.10.2013

Вы можете использовать GROUP BY, чтобы сделать это за вас. Вы можете изменить часть запроса SELECT следующим образом:

SELECT patient_id, pat_firstname, pat_lastname
FROM workflow
GROUP BY patient_id
person Mike Brant    schedule 30.10.2013