powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSER c предварительной проверкой.
11 сообщений из 11, страница 1 из 1
INSER c предварительной проверкой.
    #39833059
Rassol2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Есть скрипт который выполняет запись ссылок в базу данных.
База выглядит так.
Код: 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
INSER c предварительной проверкой.
    #39833060
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INSERT IGNORE INTO <далее по тексту запроса>
+ необходим составной уникальный индекс по двум указанным полям.
...
Рейтинг: 0 / 0
INSER c предварительной проверкой.
    #39833067
Rassol2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
INSER c предварительной проверкой.
    #39833082
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rassol2Ведь в таком случаи у меня будет куча дублей.
Вы зря прочитали только начало. Вторая строка ответа критически важна.
...
Рейтинг: 0 / 0
INSER c предварительной проверкой.
    #39833201
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
INSER c предварительной проверкой.
    #39833202
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще в мускуле есть возможность повесить 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
INSER c предварительной проверкой.
    #39833280
Rassol2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
INSER c предварительной проверкой.
    #39833282
Rassol2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полудуха вообще в мускуле есть возможность повесить 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
INSER c предварительной проверкой.
    #39833319
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rassol2В итоге я спокойно дублирую строкиА то, что у них разные ID - ты в упор не видишь?
Код: sql
1.
CREATE UNIQUE INDEX idx_a_b ON oc_test (a, b)

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

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

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

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


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