powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / insert if not exists
3 сообщений из 3, страница 1 из 1
insert if not exists
    #39153992
Pim.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток!

Имеется две связанные таблицы. И временная таблица tmp_foo, в которой хранится набор foo_name,bar_name.

Мне необходимо вставить в таблицу foo все значения из tmp_foo так, чтобы сначала была проверка, все ли bar_name из tmp_foo существуют в bar и если нет, то записала эти новые значения. А потом уже вставляла все значения (insert ... on duplicate key update) в таблицу foo.

В данном случае, необходимо:
добавить в таблицу bar значения 'd' и 'e' (insert if not exists?)

insert into foo (foo_id,bar_id) (select ... from tmp_foo join bar on duplicate key update ...)

Со вторым пунктом вроде понятно, а вот первый не понимаю, как сделать.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
CREATE TABLE IF NOT EXISTS bar (
bar_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
bar_name VARCHAR(255),
PRIMARY KEY (bar_id),
UNIQUE KEY bar_name (bar_name)
) ENGINE = INNODB;

CREATE TABLE IF NOT EXISTS foo (
foo_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
foo_name VARCHAR(255),
bar_id INT UNSIGNED NOT NULL,
PRIMARY KEY (foo_id),
UNIQUE KEY foo_name (foo_name),
CONSTRAINT fk_bar_id FOREIGN KEY (bar_id) REFERENCES bar (bar_id)
) ENGINE = INNODB;

INSERT INTO bar VALUES (1,'a'),(2,'b'),(3,'c');
INSERT INTO foo VALUE (1,'qwe',1),(2,'asd',1),(3,'zxc',2),(4,'rty',2),(5,'dfg',3);

SELECT f.foo_id,f.foo_name,b.bar_id,b.bar_name FROM foo f JOIN bar b ON f.bar_id=b.bar_id;

+--------+----------+--------+----------+
| foo_id | foo_name | bar_id | bar_name |
+--------+----------+--------+----------+
|      1 | qwe      |      1 | a        |
|      2 | asd      |      1 | a        |
|      3 | zxc      |      2 | b        |
|      4 | rty      |      2 | b        |
|      5 | dfg      |      3 | c        |
+--------+----------+--------+----------+

CREATE TEMPORARY TABLE IF NOT EXISTS tmp_foo (
foo_name VARCHAR(255),
bar_name VARCHAR(255)
);

INSERT INTO tmp_foo VALUES ('qwe','a'),('asd','b'),('zxc','b'),('rty','d'),('dfg','d'),('cvb','a'),('uio','e');

SELECT * FROM tmp_foo;

+----------+----------+
| foo_name | bar_name |
+----------+----------+
| qwe      | a        |
| asd      | b        |
| zxc      | b        |
| rty      | d        |
| dfg      | d        |
| cvb      | a        |
| uio      | e        |
+----------+----------+
...
Рейтинг: 0 / 0
insert if not exists
    #39153996
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделайте уникальный ключ на BAR и вставляйте туда данные через INSERT IGNORE
Добавятся только те, которых там не было.
...
Рейтинг: 0 / 0
insert if not exists
    #39154005
Pim.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvano,

Точно. Спасибо большое!

Получилось следующее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
INSERT IGNORE INTO bar (bar_name) 
SELECT bar_name FROM tmp_foo;

INSERT IGNORE INTO foo (foo_name,bar_id)
SELECT t.foo_name, b.bar_id FROM tmp_foo t JOIN bar b ON b.bar_name=t.bar_name
ON DUPLICATE KEY UPDATE bar_id=b.bar_id;

SELECT f.foo_id,f.foo_name,b.bar_id,b.bar_name FROM foo f JOIN bar b ON f.bar_id=b.bar_id;

+--------+----------+--------+----------+
| foo_id | foo_name | bar_id | bar_name |
+--------+----------+--------+----------+
|      1 | qwe      |      1 | a        |
|      6 | cvb      |      1 | a        |
|      2 | asd      |      2 | b        |
|      3 | zxc      |      2 | b        |
|      4 | rty      |      4 | d        |
|      5 | dfg      |      4 | d        |
|      7 | uio      |      5 | e        |
+--------+----------+--------+----------+
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / insert if not exists
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]