2009-02-16 38 views
3

我有一個MySQL數據庫,我想插入一些值到一個表中,假設我插入的特定值與不同的表中的值不匹配。對於MySQL,如果條件中該值不存在於另一個表中,我該如何插入表中?

下面是一個簡化/示例結構:

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

Table: donotinvite 
    name : varchar (index) 

是否有可能做一個「名稱」和「消息」對條件插入到「邀請」表假設「名稱」不將'donotinvite'表中的任何'姓名'與單個語句匹配?

可能是這樣的嗎?

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

回答

3

(我是一個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

這樣做可以完成這項工作,但我不確定它會做得好。它可能爲你的應用程序中工作:

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,一個目錄下的所有,你可以發送邀請的人嗎?

+0

希望MySQL能夠足夠聰明地將其歸結爲快速哈希/索引檢查。或者,它可能會很慢。 +1不管 – postfuturist 2009-02-16 19:29:04

+0

是的,理想情況下,所有涉及的表格都將在名稱上進行良好的索引。或者更好的是,您的製作應用程序可能會使用數字ID和外鍵,這將導致更短的鍵和更好的性能。 – 2009-02-16 20:10:20

4
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 
1

這裏是jonstjohn的奇怪刪除答案,我稍微修改再發布:

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

編輯:這並沒有做我想做的:)。

2
INSERT INTO invites (name, message) 
SELECT 'joe', 'This is an invite' FROM (SELECT 1) t 
WHERE NOT EXISTS (SELECT * FROM donotinvite WHERE name = 'joe'); 
相關問題