Как вставить письмо в другую таблицу без дубликата - PullRequest
2 голосов
/ 27 октября 2011

Допустим, у меня есть 2 таблицы в моей базе данных. users и combineusers

Я хочу вставить текущее письмо на users на combineusers без дубликата электронного письма.

INSERT INTO combineusers (Email)
SELECT Email FROM users

Какое правильное утверждение, чтобы пропустить существующий адрес электронной почты на combineusers

Ответы [ 5 ]

2 голосов
/ 27 октября 2011

MySQL имеет нестандартную возможность пропустить дубликаты вместо выдачи ошибки:

INSERT IGNORE INTO combineusers (Email)
SELECT Email FROM users

Я цитирую руководство :

Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT, вместо этого рассматриваются как предупреждения.Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дубликата ключа, и оператор прерывается.При IGNORE строка все еще не вставляется, но ошибка не выдается.

1 голос
/ 27 октября 2011

Попробуйте

INSERT INTO combineusers (Email) SELECT DISTINCT Email FROM users
1 голос
/ 27 октября 2011
INSERT INTO combineusers (Email) 
SELECT Email FROM users u
LEFT JOIN combineusers c ON c.Email = u.Email
WHERE c.Email IS NULL

ИЛИ используя NOT EXISTS

INSERT INTO combineusers (Email) 
SELECT Email FROM users u
WHERE NOT EXISTS 
      (
       SELECT Email 
       FROM combineusers c 
       WHERE c.Email = u.Email
      )
1 голос
/ 27 октября 2011

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

INSERT INTO combineusers (Email) 
SELECT * FROM 
(
  SELECT DISTINCT u.Email FROM users u
  LEFT JOIN combineusers c ON (u.email = c.email)
  WHERE c.email IS NULL
) sub
0 голосов
/ 27 октября 2011

Ваш вопрос не так четко сформулирован, но если я правильно понимаю, что вы имеете в виду, вы хотите взять адрес электронной почты от users и вставить их в combineusers, избегая при этом вставки любого адреса электронной почты, который уже находится в combineusers.Другие ответчики уже показали несколько способов манипулирования операторами, но другим способом достижения этого может быть объявление поля Email уникального combineusers.

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