MySQL:如果 table1 中的行存在,则在 table2 上插入行

Posted

技术标签:

【中文标题】MySQL:如果 table1 中的行存在,则在 table2 上插入行【英文标题】:MySQL: Insert row on table2 if row in table1 exists 【发布时间】: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);

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于MySQL:如果 table1 中的行存在,则在 table2 上插入行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:每天计算不同的行

MySQL从表1中选择不存在连接的行的有效方法

如何批量检查 MS-Access 中的重复项并记录更改?

计算联接表中的行,但如果不存在行则显示 0 - mysql

[PDO如果ID存在,则在更新时插入MySQL

Mysql 存在既更新,不存在就添加(sql语句)