powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как игнорировать запись ?
7 сообщений из 7, страница 1 из 1
как игнорировать запись ?
    #35609007
valuez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доборое время суток

Есть вопрос (может не правильно сформулирую, но попробую) :

Я уже писал, у меня 3 таблицы admins, customers, owners. в каждом из них есть поле
is_deleted boolean not null default false
и login varchar(32) not null

Поле is_deleted подразумевает то, что если оно равно true то этот пользователь стёрт. Но в действительности стерать нельзя, а мне надо сделать чтобы он был неактивен, и при создании нового пользователя при проверке, если такой пользователь был, но у него is_deleted = true, то логин игрорируется и создаётся пользователь с таким же логином.
проверка на уникальность (может и не правильно, но у меня работает и этого достаточно)

Код: plaintext
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.
create or replace function sp_check_login (p_login varchar)
returns boolean
as $$
declare
	v_login varchar;
	v_violation boolean;
begin
	v_login := p_login;
loop
	--checking table admins
	if exists (select login from admins where admins.login = v_login) then 
	v_violation := true;
		if v_violation = true then 
			raise exception 'login % already exists in table admins', v_login ; 
			exit; 
		else v_violation = false;
		end if;
	end if;
	--checking table customers
	if exists (select login from customers where customers.login = v_login) then 
	v_violation = true;
		if v_violation = true then
			raise exception 'login % already exists in table customers', v_login; 
			exit;
		else v_violation = false;
		end if;
	end if;
	--checking table owners
	if exists (select login from owners where owners.login = v_login) then
	v_violation = true;
	if v_violation = true then
		raise exception 'login % already exists in table owners', v_login; 
		exit;
			else v_violation = false;
		end if;
	end if;
	return v_violation;
end loop;
	
end;
$$language plpgsql;

...
Рейтинг: 0 / 0
как игнорировать запись ?
    #35609166
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select login from admins where admins.login = v_login and not is_deleted
...
Рейтинг: 0 / 0
как игнорировать запись ?
    #35609224
valuez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не то... всё равно выкидывает exception, нужно чтобы при is_deleted = true его не выкидывало а просто игнорировался старый логин
...
Рейтинг: 0 / 0
как игнорировать запись ?
    #35609484
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ каждой таблице есть unique поле login не Primary key
login varchar(32) not null uniqueправильно ? тогда Вам нужно снять ограничение unique во всех трёх таблицах.

ps: своей не удобной и неверной структурой БД Вы создаёте себе грандиозные трудности, которые потом пытаетесь мужественно преодолевать... зачем ?


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
как игнорировать запись ?
    #35609498
valuez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня так
авторis_deleted boolean not null default false
и login varchar(32) not null

unique нету
...
Рейтинг: 0 / 0
как игнорировать запись ?
    #35609881
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valuezне то... всё равно выкидывает exceptionрасскажите хотя бы, какой именно exeption. а еще лучше тестовый пример начиная от create table, create function, insert тестовых данных в таблицу, select function() с exeption-ом.
...
Рейтинг: 0 / 0
как игнорировать запись ?
    #35615462
juniorDBE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
valuez
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	if exists (select login from admins where admins.login = v_login) then 
	v_violation := true;
		if v_violation = true then 
			raise exception 'login % already exists in table admins', v_login ; 
			exit; 
		else v_violation = false;
		end if;
	end if;


Расскожите пожалуйста волшебный смысл v_violation := true; а потом сразу if v_violation = true then? Советую подумать над общей логикой всей функции вначале...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как игнорировать запись ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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