powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT обход возникновения ошибки при добавлении
7 сообщений из 7, страница 1 из 1
INSERT обход возникновения ошибки при добавлении
    #39186522
Здравствуйте

Существует таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE IF NOT EXISTS `_user_child` (
  `id` bigint(20) NOT NULL,
  `tmp` bigint(20) NOT NULL,
  `number` bigint(20) NOT NULL AUTO_INCREMENT,
  `parent` bigint(20) NOT NULL,
  `_check` varchar(25) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `number` (`number`),
  KEY `parent` (`parent`,`_check`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=999121020102 ;


Колонка tmp добавлена только для обхода запроса добавления RAND() поля

Приблизительные данные
Код: sql
1.
2.
3.
4.
5.
INSERT INTO `_user_child` (`id`, `tmp`, `number`, `parent`, `_check`) VALUES
(60, 714997027735, 714997027735, 0, 'ade0552f798180d1c786b4990'),
(54, 442617569530, 442617569530, 60, '947f68b5dc69149f56da14ab0'),
(55, 581752219779, 581752219779, 60, '2311de0b9e1c3fb130d6f355e'),
(57, 923903519216, 923903519216, 60, '58ca6bd9ab76f2688a07745a1');


И запрос добавления строк
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
INSERT INTO `_user_child`(`id`,`tmp`,`number`,`parent`,`_check`) 
VALUES(@id:=57,
	@tmp:=CAST(FLOOR(RAND()*1000000000000) AS SIGNED),
	@number:=IF((SELECT COUNT(u1.number) FROM _user_child AS u1 WHERE u1.number=(@tmp))=0,
		@tmp,(SELECT MAX(u2.number) FROM _user_child AS u2)
		),
	@parent:=(SELECT u3.id FROM _user_child AS u3 WHERE u3.number=714997027735),
	IFNULL(SUBSTRING(MD5(CONCAT(@id,@parent,@number)),6,25), '')
	)


В запросе меняются по тексту
Код: sql
1.
2.
@id:=57
u3.number=714997027735


Запрос работает
Но в нем не хватает обработки двух условий

Первое
Игнорировать вставку если @id:=57 существует Ошибка (Duplicate entry '57' for key 'id')(в принципе решаемо INSERT IGNORE)

Второе
Когда условие
Код: sql
1.
(SELECT u3.id FROM _user_child AS u3 WHERE u3.number=714997027735


возвращает NULL
Тогда запрос возвращает (Column 'parent' cannot be null)

Как раз в этих вариантах вставлять строку и не надо.
Сейчас ошибки просто игнорируются на стороне клиента.
Но понадобилось использовать его в multi_query и на нем будет прерываться запрос.
...
Рейтинг: 0 / 0
INSERT обход возникновения ошибки при добавлении
    #39186539
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переделайте на конструкцию INSERT INTO .... SELECT ... WHERE
в секции WHERE укажите исключения
...
Рейтинг: 0 / 0
INSERT обход возникновения ошибки при добавлении
    #39186544
Alex_Ustinovпеределайте на конструкцию INSERT INTO .... SELECT ... WHERE
в секции WHERE укажите исключения
А что произойдет если SELECT возвратит NULL в те поля в которых их быть не должно.
Он также вернет Column 'Х' cannot be null
И прервет выполнение сценария.
Мне нужно чтобы он просто не вставил строку. и сделал это без ошибок.
...
Рейтинг: 0 / 0
INSERT обход возникновения ошибки при добавлении
    #39186551
Как я уже писал INSERT IGNORE избавляет от первой ошибки (Duplicate entry '57' for key 'id')
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
INSERT IGNORE INTO `_user_child`(`id`,`tmp`,`number`,`parent`,`_check`) 
VALUES(@id:=57,
	@tmp:=CAST(FLOOR(RAND()*1000000000000) AS SIGNED),
	@number:=IF((SELECT COUNT(u1.number) FROM _user_child AS u1 WHERE u1.number=(@tmp))=0,
		@tmp,(SELECT MAX(u2.number) FROM _user_child AS u2)
		),
	@parent:=(SELECT u3.id FROM _user_child AS u3 WHERE u3.number=714997027735),
	IFNULL(SUBSTRING(MD5(CONCAT(@id,@parent,@number)),6,25), '')
	)


Но как проигнорировать вставку когда
Код: sql
1.
@parent:=(SELECT u3.id FROM _user_child AS u3 WHERE u3.number=714997027735)

Возвращает NULL

Пока в голову проходит только одно
Создать техническую строку с определенным id например "0" в таблице и просто подменять текущий id этим техническим.
Приблизительно так
Код: sql
1.
@id:=IF((SELECT u3.id FROM _user_child AS u3 WHERE u3.number=714997027735)!=NULL,57,0)


Но хотелось от этого избавиться, так как эта строка может вылезти в каком-то отчете а пересматривать все отчеты не охото
...
Рейтинг: 0 / 0
INSERT обход возникновения ошибки при добавлении
    #39186680
Остановился на таком запросе
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
INSERT IGNORE INTO `_user_child`(`id`,`tmp`,`number`,`parent`,`_check`) 
VALUES(@id:=(IF((SELECT u3.id FROM _user_child AS u3 WHERE u3.number=76536596560350)=NULL,
		(SELECT u4.id FROM _user_child AS u4 LIMIT 1),57)),
	@tmp:=CAST(FLOOR(RAND()*1000000000000) AS SIGNED),
	@number:=IF((SELECT COUNT(u1.number) FROM _user_child AS u1 WHERE u1.number=(@tmp))=0,
		@tmp,(SELECT MAX(u2.number)+1 FROM _user_child AS u2)
		),
	@parent:=(SELECT u3.id FROM _user_child AS u3 WHERE u3.number=76536596560350),
	IFNULL(SUBSTRING(MD5(CONCAT(@id,@parent,@number)),6,25),'')
	)


Опрашиваю значение интересующего параметра в генерации поля для уникального ID
Код: sql
1.
IF((SELECT u3.id FROM _user_child AS u3 WHERE u3.number=76536596560350


и если оно возвращает NULL выбираю из базы первый ID
Код: sql
1.
SELECT u4.id FROM _user_child AS u4 LIMIT 1


для того чтобы вызвать IGNORE при добавлении строки.
После чего генерирую cслучайный номер
Код: sql
1.
@tmp:=CAST(FLOOR(RAND()*1000000000000) AS SIGNED)


и помещаю его в поле для хранения временного номера.
Проверяю его на уникальность
Код: sql
1.
(SELECT COUNT(u1.number) FROM _user_child AS u1 WHERE u1.number=(@tmp))


Если такой присутствует
Код: sql
1.
SELECT MAX(u2.number)+1 FROM _user_child AS u2


Он у меня начинается с 999000000000
Что позволяет RAND() жить своей жизнью в диапазоне от 0 до 899999999999
...
Рейтинг: 0 / 0
INSERT обход возникновения ошибки при добавлении
    #39187763
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай Жуков
Код: sql
1.
=NULL

IS NULL
...
Рейтинг: 0 / 0
INSERT обход возникновения ошибки при добавлении
    #39188664
tanglirНиколай Жуков
Код: sql
1.
=NULL

IS NULL

Да точно как-то провтыкал
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT обход возникновения ошибки при добавлении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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