Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 10.10.2015, 06:26   #1
Parallelogram
Форумчанин
 
Регистрация: 18.01.2011
Адрес: Живу по адресу: Parallelogram@list.ru
Сообщений: 144
Репутация: 35
По умолчанию

У меня есть таблица вида: 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 в 09:27.
Parallelogram вне форума   Ответить с цитированием
Старый 10.10.2015, 08:55   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,098
Репутация: 6385
По умолчанию

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

Цитата:
лучше бы сделать это одним запросом или с помощью триггера
А еще лучше написать хранимую процедуру, в которой будет запрос типа:
Код:

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, 09:43   #4
Parallelogram
Форумчанин
 
Регистрация: 18.01.2011
Адрес: Живу по адресу: Parallelogram@list.ru
Сообщений: 144
Репутация: 35
По умолчанию

Как и в моем случае выдает ошибку: #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, 10:07   #5
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,842
Репутация: 6832
По умолчанию

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

У меня 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 в 10:21.
Parallelogram вне форума   Ответить с цитированием
Старый 10.10.2015, 11:58   #7
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,842
Репутация: 6832
По умолчанию

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

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

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 в 17:23.
Parallelogram вне форума   Ответить с цитированием
Старый 10.10.2015, 18:12   #9
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,098
Репутация: 6385
По умолчанию

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

Не работает! Есть таблица . Создал процедуру:
Код:

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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
если дата 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 18:33
Если равно, то пустое иначе значение kzld Microsoft Office Excel 4 15.12.2010 11:21
если элементы k-й строки матрицы упорядочены по убыванию, иначе 0 nesss Помощь студентам 1 01.11.2010 16:41


20:22.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru