2013-05-04 65 views
1

我目前使用SELECT而不是VALUES的方式插入數據,因爲它是默認的。問題是,我找不到只有在數據庫中才插入數據的方法。只有在不存在的情況下插入MYSQL

這是我當前的查詢:

INSERT INTO collectives_users(id_user,id_artistname,id_collective,users_type,status) 
SELECT 
    (SELECT id_user FROM artistnames WHERE artistname = 'yoannis'), 
    (SELECT id FROM artistnames WHERE artistname = 'yoannis'), 
    ('1'),(2),(0) 
UNION ALL 
SELECT 
    (SELECT id_user FROM artistnames WHERE artistname = 'paul'), 
    (SELECT id FROM artistnames WHERE artistname = 'paul'), 
    ('1'),(4),(0) 

INSERT IGNORE INTO 

不工作時,並沒有真正合適的(不返回錯誤)

試過我也試圖與

AND NOT EXIST 

不起作用。

如果你有一個想法不要猶豫。

+0

表中的獨特列是什麼? – 2013-05-04 15:48:35

+0

嘗試像select * from(select ... union all select ...)_t where ... not in(select ... from collective_users)來嘗試給括號加上括號 – 2013-05-04 15:51:10

+0

@JW你的意思是主鍵。 – Juampi 2013-05-04 15:58:45

回答

2

您是否試過 REPLACE語法?它的工作原理與INSERT相同,只使用 REPLACE而不是 INSERT

如何在collectives_users表中設置一個虛擬列,所以我們可以例如計算髮現重複的次數。通過這種方式,我們可以使用INSERT ... ON DUPLICATE KEY UPDATE語法:

INSERT INTO collectives_users(id_user,id_artistname,id_collective,users_type,status) 
SELECT 
    (SELECT id_user FROM artistnames WHERE artistname = 'yoannis'), 
    (SELECT id FROM artistnames WHERE artistname = 'yoannis'), 
    ('1'),(2),(0) 
UNION ALL 
SELECT 
    (SELECT id_user FROM artistnames WHERE artistname = 'paul'), 
    (SELECT id FROM artistnames WHERE artistname = 'paul'), 
    ('1'),(4),(0) 
ON DUPLICATE KEY UPDATE dummy_column = dummy_column + 1; 

另一種方法是創建一個存儲過程。這比較棘手。

代碼示例:在MySQL參考手冊

DELIMITER \\ 
DROP PROCEDURE IF EXISTS sp_test\\ 
CREATE PROCEDURE sp_test(in_id_user, in_id_artistname, in_id_collective, in_users_type, in_status) 
BEGIN 

CASE 
    WHEN NOT EXISTS (SELECT id_user FROM artistnames WHERE artistname = 'yoannis') OR ... 
    THEN INSERT ... 
END CASE; 

END\\ 
DELIMITER ; 

更多信息的INSERT ... ON DUPLICATE KEY UPDATECASE語法1

+0

'替換'將刪除和重新添加一行。使用'insert ... on duplicate key update'通常會更好一些' – Andomar 2013-05-04 15:51:51

+0

您在這裏更新值,我不想這樣做。我想離開插入並測試下一個。 – Simon 2013-05-04 16:01:27

+1

剛剛刪除'+ 1'示例'在重複密鑰更新dummy_column = dummy_column;' – 2013-05-04 16:06:18

0

當你有一個UNIQUE可以使用ON DUPLICATE KEY UPDATE運行沒有風險,並且重複的值會更新,以便有沒有重複的,與虛擬列的想法:

INSERT INTO collectives_users(id_user,id_artistname,id_collective,users_type,status) 
SELECT 
    (SELECT id_user FROM artistnames WHERE artistname = 'yoannis'), 
    (SELECT id FROM artistnames WHERE artistname = 'yoannis'), 
    ('1'),(2),(0) 
UNION ALL 
SELECT 
    (SELECT id_user FROM artistnames WHERE artistname = 'paul'), 
    (SELECT id FROM artistnames WHERE artistname = 'paul'), 
    ('1'),(4),(0) 
ON DUPLICATE KEY UPDATE dummy_column = dummy_column + 1; 

我建議你使用WHERE NOT EXISTS代替

INSERT INTO collectives_users(id_user,id_artistname,id_collective,users_type,status) 
SELECT 
    (SELECT id_user FROM artistnames WHERE artistname = 'yoannis'), 
    (SELECT id FROM artistnames WHERE artistname = 'yoannis'), 
    ('1'),(2),(0) 
UNION ALL 
SELECT 
    (SELECT id_user FROM artistnames WHERE artistname = 'paul'), 
    (SELECT id FROM artistnames WHERE artistname = 'paul'), 
    ('1'),(4),(0) 
WHERE NOT EXISTS(SELECT Id 
     FROM collectives_users t2 
     WHERE t2.Id = artistnames.Id 

我沒有嘗試的代碼,但它是你可以看看其中的味道。此外,更多關於'WHERE NOT EXISTS'in this thread

相關問題