【问题标题】:MySQL: Insert row on table2 if row in table1 existsMySQL:如果 table1 中的行存在,则在 table2 上插入行
【发布时间】:2010-05-05 01:14:25
【问题描述】:

我正在尝试设置一个 MySQL 查询,如果 table1 中的一行已经存在,它将在 table2 中插入一行,否则它只会将该行插入到 table1 中。

我需要找到一种方法来调整以下查询,以便使用现有行的 id 在 table2 中插入一行。

INSERT INTO table1 (host, path) VALUES ('youtube.com', '/watch') IF NOT
EXISTS (SELECT * FROM table1 WHERE host='youtube.com' AND path='/watch' LIMIT 1);

有点像这样:

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

除非我不知道这个的语法。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用触发器、table1 上的唯一键或主键以及 INSERT IGNORE。

    如果您在 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;
    

    【讨论】:

    • 谢谢,这比每次都更新行好得多!
    【解决方案2】:

    我相信你可以通过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;
    

    免责声明:未经测试。

    【讨论】:

    • 感谢您的帮助,但这不是我想要的。我最终更新了该行以防它已经存在,并添加一个触发器以在 table1 中的一行被更新时在 table2 中插入一行。
    【解决方案3】:

    这是我想出的解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多