С MySQL, как вставить в таблицу при условии, что значение не существует в другой таблице? - PullRequest
3 голосов
/ 16 февраля 2009

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

Вот упрощенная / примерная структура:

Table: invites
    id : int (auto-increment index)
    name : varchar
    message : varchar

Table: donotinvite
    name : varchar (index)

Можно ли сделать условную вставку пары «имя» и «сообщение» в таблицу «приглашает», если предположить, что «имя» не соответствует ни одному «имени» из таблицы «донотинвайт» с одним оператором?

Что-то вроде этого, возможно?

INSERT INTO invites
    SET name = 'joe', message = 'This is an invite'
WHERE NOT EXISTS 
    (SELECT name 
    FROM donotinvite
    WHERE name = 'joe')

Ответы [ 5 ]

4 голосов
/ 16 февраля 2009
INSERT
INTO invites (name, message)
SELECT a.name, a.message
FROM (SELECT @name AS name, @message AS message) a
LEFT JOIN donotinvite d
ON a.name = d.name
WHERE d.name IS NULL
3 голосов
/ 16 февраля 2009

(я специалист по MSSQL, поэтому не уверен, что все подходит для MySQL)

INSERT INTO invites
(
    name, message
)
SELECT name = 'joe', message = 'This is an invite'
WHERE NOT EXISTS 
    (SELECT *
    FROM donotinvite
    WHERE name = 'joe')

На практике вы можете поместить все Имя / Сообщение во временную таблицу и затем сделать:

INSERT INTO invites
(
    name, message
)
SELECT T.name, T.message
FROM MyTempTable AS T
WHERE NOT EXISTS 
(
    SELECT *
    FROM donotinvite AS DNI
    WHERE DNI.name = T.name
)
2 голосов
/ 31 октября 2012
INSERT INTO invites (name, message) 
SELECT 'joe', 'This is an invite' FROM (SELECT 1) t 
WHERE NOT EXISTS (SELECT * FROM donotinvite WHERE name = 'joe');
2 голосов
/ 16 февраля 2009

Это сделало бы работу, но я не уверен, что это получилось бы так хорошо. Это может работать для вашего приложения:

INSERT INTO invites(name, message) 
SELECT p.name, "This is an invite" 
FROM people AS p  
WHERE p.name NOT IN (SELECT name FROM donotinvite);

У вас есть таблица типа people, каталог всех приглашенных людей?

1 голос
/ 16 февраля 2009

Переиздание странно удаленного ответа jonstjohn , слегка измененного мной:

INSERT INTO invites (name, message) 
    SELECT 'joe','This is an invite' 
    FROM donotinvite 
    WHERE name <> 'joe'

РЕДАКТИРОВАТЬ: это не делает то, что я хочу :).

...