Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSER c предварительной проверкой. / 11 сообщений из 11, страница 1 из 1
03.07.2019, 01:57
    #39833059
Rassol2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
Здравствуйте.

Есть скрипт который выполняет запись ссылок в базу данных.
База выглядит так.
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE `oc_pars_link` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`dn_id` int(3) NOT NULL, 
`link` text NOT NULL, 
`scan` int(1) NOT NULL DEFAULT '1', PRIMARY KEY (`id`)
 ) ENGINE=MyISAM AUTO_INCREMENT=228983 DEFAULT CHARSET=utf8



У меня есть массив с ссылками которые нужно записать в эту базу.
Но поле dn_id определяет форму. А разных форм могут быть одинаковые ссылки.
То есть нельзя допустить что бы было две записи где поле dn_id = 1 и link = 'sql.ru'

на php это реализовано так.
Код: php
1.
2.
3.
4.
$count = $this->db->query("SELECT id FROM `oc_pars_link` WHERE `link`='".$this->db->escape($link)."' AND `dn_id` =".(int)$dn_id." LIMIT 1");
if($count->num_rows == 0){
	$this->db->query("INSERT INTO `oc_pars_link` SET `link` ='".$this->db->escape($link)."', `dn_id`=".(int)$dn_id);
} 



По сути производится два запроса. Первый делает выборку. И затем уже php проверяет есть такая запись или нет. И если нет то делает INSERT

А вот суть самого вопроса. Из этого действия я хочу выкинуть проверку на php
Но уже третий день не могу найти решения.
Как выглядит sql запрос который перед тем как произвести INSERT проверяет существует ли такая запись, причем проверяет по полям которые не есть уникальным ключем.

Подскажите как это можно сделать, за ранние спасибо. :)
...
Рейтинг: 0 / 0
03.07.2019, 02:16
    #39833060
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
INSERT IGNORE INTO <далее по тексту запроса>
+ необходим составной уникальный индекс по двум указанным полям.
...
Рейтинг: 0 / 0
03.07.2019, 05:01
    #39833067
Rassol2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
vkleINSERT IGNORE INTO <далее по тексту запроса>
+ необходим составной уникальный индекс по двум указанным полям.

не совсем понимаю как это мне поможет.
Ведь в таком случаи у меня будет куча дублей.

Мне нужно составить запрос который заменял бы вот эти два.
Код: plsql
1.
2.
SELECT id FROM `oc_pars_link` WHERE `link`='https://www.sql.ru/' AND `dn_id` ="1" LIMIT 1
INSERT INTO `oc_pars_link` SET `link` ='https://www.sql.ru/', `dn_id`="1"



И учитывая то что в таблице есть id уникальный ключ, автоинкримент.
В такмо случаи получится 3 поля первичный ключ.
1. id авто инкремент.
2. dn_id
3. link

А значит INSERT IGNOR INTO будет всегда добавлять новые записи.
...
Рейтинг: 0 / 0
03.07.2019, 07:16
    #39833082
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
Rassol2Ведь в таком случаи у меня будет куча дублей.
Вы зря прочитали только начало. Вторая строка ответа критически важна.
...
Рейтинг: 0 / 0
03.07.2019, 12:23
    #39833201
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
Код: sql
1.
INSERT INTO oc_pars_link SET link = 'https://www.sql.ru/', dn_id = (SELECT count(*) + 1 FROM oc_pars_link WHERE link = 'https://www.sql.ru/');



зы: индексировать ссылки это дичь
...
Рейтинг: 0 / 0
03.07.2019, 12:24
    #39833202
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
а вообще в мускуле есть возможность повесить AUTO_INCREMENT на одно поле, в зависимости от другого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
-- чтобы избежать дублей можно - так https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html
-- это фишка ТОЛЬКО ДЛЯ MyISAM!
CREATE TABLE abc (name1 VARCHAR(255), name2 INT AUTO_INCREMENT, KEY (name1,name2));
INSERT INTO abc (name1) VALUES ('abc');
INSERT INTO abc (name1) VALUES ('abc');
INSERT INTO abc (name1) VALUES ('abcd');
INSERT INTO abc (name1) VALUES ('abcd');
INSERT INTO abc (name1) VALUES ('abc');
SELECT * FROM abc;
+-------+-------+
| name1 | name2 |
+-------+-------+
| abc   |     1 |
| abc   |     2 |
| abc   |     3 |
| abcd  |     1 |
| abcd  |     2 |
+-------+-------+
-- НО это плохой приём для таблицы, где надо будет удалять строки
...
Рейтинг: 0 / 0
03.07.2019, 13:58
    #39833280
Rassol2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
vkleINSERT IGNORE INTO <далее по тексту запроса>
+ необходим составной уникальный индекс по двум указанным полям.

Можете расписать мне, потому что я что то не пойму как должно быть.
Для проверки создал тестовую базу данных.
авторCREATE TABLE `oc_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL, PRIMARY KEY (`id`,`a`,`b`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8


И начал тестировать запросом на вставку
INSERT IGNORE INTO oc_test SET a=1, b=2 ;
INSERT IGNORE INTO oc_test SET a=1, b=2 ;

В итоге я спокойно дублирую строки .
http://i.imgur.com/Okvdyhk.png

Как это должно работать ?
...
Рейтинг: 0 / 0
03.07.2019, 13:59
    #39833282
Rassol2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
полудуха вообще в мускуле есть возможность повесить AUTO_INCREMENT на одно поле, в зависимости от другого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
-- чтобы избежать дублей можно - так https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html
-- это фишка ТОЛЬКО ДЛЯ MyISAM!
CREATE TABLE abc (name1 VARCHAR(255), name2 INT AUTO_INCREMENT, KEY (name1,name2));
INSERT INTO abc (name1) VALUES ('abc');
INSERT INTO abc (name1) VALUES ('abc');
INSERT INTO abc (name1) VALUES ('abcd');
INSERT INTO abc (name1) VALUES ('abcd');
INSERT INTO abc (name1) VALUES ('abc');
SELECT * FROM abc;
+-------+-------+
| name1 | name2 |
+-------+-------+
| abc   |     1 |
| abc   |     2 |
| abc   |     3 |
| abcd  |     1 |
| abcd  |     2 |
+-------+-------+
-- НО это плохой приём для таблицы, где надо будет удалять строки



А их нужно будет удалять :(
...
Рейтинг: 0 / 0
03.07.2019, 14:40
    #39833319
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
Rassol2В итоге я спокойно дублирую строкиА то, что у них разные ID - ты в упор не видишь?
Код: sql
1.
CREATE UNIQUE INDEX idx_a_b ON oc_test (a, b)

И вот оно, счастье-то...
...
Рейтинг: 0 / 0
03.07.2019, 19:35
    #39833532
Rassol2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
AkinaRassol2В итоге я спокойно дублирую строкиА то, что у них разные ID - ты в упор не видишь?
Код: sql
1.
CREATE UNIQUE INDEX idx_a_b ON oc_test (a, b)

И вот оно, счастье-то...
Большое спасибо. Теперь работает.

Я не то что бы не видел, я не понимал что вы имеете в виду. Я и про UNIQUE ничего не знал. Только начинаю осваивать.
SQl владею очень на поверхностном уровне.
И не мог составить правильный вопрос в гугл, по этому и обратился за помощью.

Еше раз спасибо.
...
Рейтинг: 0 / 0
03.07.2019, 20:25
    #39833540
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSER c предварительной проверкой.
Rassol2И не мог составить правильный вопрос в гуглНууу, можно было просто скопипастить название непонятного.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSER c предварительной проверкой. / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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