Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2015, 05:26   #1
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

У меня есть таблица вида: NOMER COD. Нужно проверить, если телефон уже есть в базе, то обновить COD, если нет в базе, то создать запить телефон - код. У меня получается что-то подобное сделать с помощью циклов в php, но лучше бы сделать это одним запросом или с помощью триггера.

Единственное что я придумал, и конечно же не работает:
PHP код:
IF (SELECT FROM `wi_tel_codWHERE EXISTS (`tel` = 1234567890))
    
BEGIN
        UPDATE 
`wi_tel_cod`
        
SET `cod` = 4321
        WHERE 
`tel` = 1234567890
    END
ELSE
    
BEGIN
        INSERT  INTO 
`wi_tel_cod`
        
VALUES('1234567890''4321')
    
END 
И такой не работает
PHP код:
begin
    
IF (SELECT FROM `wi_tel_codWHERE `tel`='1234567890'THEN
        UPDATE 
`wi_tel_cod`    SET `cod`='8765' WHERE `tel`='1234567890';
    ELSE
        
INSERT INTO `wi_tel_codVALUES ('1234567890''4321');
    
END IF;
end 

Последний раз редактировалось Stilet; 10.10.2015 в 08:27.
Parallelogram вне форума Ответить с цитированием
Старый 10.10.2015, 07:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну коль if СУБД поддерживает, значит не просто if (select, а IF EXISTS(SELECT ...)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.10.2015, 08:29   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
лучше бы сделать это одним запросом или с помощью триггера
А еще лучше написать хранимую процедуру, в которой будет запрос типа:
Код:
declare @i int=SELECT * FROM `wi_tel_cod` WHERE `tel`=@tel
if i=0 then
 Обновляем
else
 Создаем
Где @tel - параметр процедуры (телефон)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.10.2015, 08:43   #4
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Как и в моем случае выдает ошибку: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near... at line 1
И я не знаю, поддерживает if СУБД или нет.
Parallelogram вне форума Ответить с цитированием
Старый 10.10.2015, 09:07   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

И какая же у тебя СУБД?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.10.2015, 09:18   #6
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

У меня MySQL
Я в phpmyadmin делаю SQL запрос:
Код:
SET @tel varchar(10)= 1234567890;
declare @i int=SELECT * FROM `wi_tel_cod` WHERE `tel`=@tel;
if i=0 then
 UPDATE `wi_tel_cod` SET `cod`='8765' WHERE `tel`=@tel;
else
 INSERT INTO `wi_tel_cod` VALUES (@tel, '4321');

Последний раз редактировалось Parallelogram; 10.10.2015 в 09:21.
Parallelogram вне форума Ответить с цитированием
Старый 10.10.2015, 10:58   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я в phpmyadmin делаю SQL запрос:
Я не зря написал
Цитата:
лучше написать хранимую процедуру
.
Эти два слова чрезвычайно важны в моем посыле.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.10.2015, 15:52   #8
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Я не понимаю как работают хранимые процедуры.
Код:
DELIMITER //  

CREATE PROCEDURE `var_proc` (IN tel VARCHAR(10), IN cod INT)
BEGIN  
    DECLARE @i int=SELECT * FROM `wi_tel_cod` WHERE `tel`=@tel;
    if i=0 THEN
     UPDATE `wi_tel_cod` SET `cod`=@cod WHERE `tel`=@tel;
    else
     INSERT INTO `wi_tel_cod` VALUES (NULL, @tel, @cod);
END //
Все равно выдает ту же ошибку.

Чтобы понимать, в том ли направлении я копаю. Правильно понимаю, что при вызове вот этой процедуры, в таблице "wi_tel_cod" изменится поле "cod" на введенное 4321?
Код:
CREATE PROCEDURE `var_proc` (IN tel VARCHAR(10), IN cod INT)
BEGIN
	SELECT * FROM `wi_tel_cod` WHERE `tel`=@tel
	UPDATE `wi_tel_cod` SET `cod`=@cod WHERE `tel`=@tel
END



CALL var_proc(1234567890, 4321)

Последний раз редактировалось Stilet; 11.10.2015 в 16:23.
Parallelogram вне форума Ответить с цитированием
Старый 10.10.2015, 17:12   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну да, только SELECT там вообще не при делах
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.10.2015, 17:41   #10
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Не работает! Есть таблица . Создал процедуру:
Код:
DELIMITER //
CREATE PROCEDURE `var_proc` (IN tel VARCHAR(10), IN cod INT)
BEGIN
	UPDATE `wi_tel_cod` SET `cod`=@cod WHERE `tel`=@tel;
END
Пытаюсь вызвать: CALL var_proc (1234567890, 1234). Говорит, что запрос выполнен, но ничего не меняется.
Parallelogram вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
если дата m,d,y предшествует дате m1,d1,y1, иначе t=false. с++ Lers Помощь студентам 12 13.12.2012 23:58
Если А1 принадлежит диапазону D1:D100 то 1 иначе 0 PARTOS Microsoft Office Excel 1 16.10.2012 00:21
как удалить строку из combobox, если такая уже есть и добавить в начало новую? codermoder Общие вопросы Delphi 6 14.01.2011 17:33
Если равно, то пустое иначе значение kzld Microsoft Office Excel 4 15.12.2010 10:21
если элементы k-й строки матрицы упорядочены по убыванию, иначе 0 nesss Помощь студентам 1 01.11.2010 15:41