2010-05-05 60 views
1

如果table1中的行已經存在,我試圖設置一個MySQL查詢來插入一行到table2中,否則它只會將該行插入到table1中。MySQL:如果table1中的行存在,則在table2上插入行

我需要找到一種方法,以適應以下查詢插入一行到table2與現有的行ID。

INSERT INTO表1(主機,路徑)VALUES( 'youtube.com', '/手錶')IF NOT
EXISTS(SELECT * FROM表1 WHERE主機= 'youtube.com' AND路徑='/觀看'LIMIT 1);

東西有點像這樣:

INSERT ... IF NOT EXISTS(..)ELSE INSERT INTO表2(table1_id)VALUES(row.id);

除了我不知道這個的語法。

回答

1

您可以使用觸發器,對錶1的唯一或主鍵和INSERT忽略不計。

如果您在table1中插入了一個已經存在的值,那麼INSERT IGNORE將不會返回重複鍵錯誤。 觸發器會檢查table1中的值是否已經存在並將其插入到table2中。 如果需要,還可以在table2上添加一個唯一鍵並在觸發器中使用INSERT IGNORE。

上帝保佑!

CREATE TABLE `table1` (
    `id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ; 

CREATE TABLE `table2` (
    `id` int(11) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

DELIMITER $$ 
CREATE 
    DEFINER = CURRENT_USER 
    TRIGGER `table1_insert` BEFORE INSERT 
    ON table1 
    FOR EACH ROW BEGIN 
    if exists (select * from table1 where id = new.id) then 
     insert into table2 (id) values (new.id); 
    end if; 
    END$$ 
DELIMITER ; 

insert ignore into table1(id) values(1); 
select * from table1; 
select * from table2; 
+0

謝謝,這比每次更新行更好! – 2010-05-06 03:40:52

0

你可以用INSERT INTO SELECT來實現這個我相信。

INSERT INTO 
    table1 (host, path) 
SELECT 
    table2.host, table2.path 
FROM 
    table2 
WHERE 
    table2.host='youtube.com' AND path='/watch' 
LIMIT 1; 

免責聲明:未經測試。

+0

感謝您的幫助,但那不是我想要的。如果它已經存在,我最終更新行,並添加一個觸發器,以便在table1中的行更新時在table2中插入一行。 – 2010-05-05 13:13:53

0

這是我想出瞭解決方案:

CREATE TRIGGER onUpdate BEFORE UPDATE ON table1 FOR EACH ROW INSERT INTO table2 SET t1_row = OLD.id 
相關問題