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 上插入行的主要内容,如果未能解决你的问题,请参考以下文章