2014-01-09 6 views
6

У меня есть таблица с тремя универсальными ключами, которые также являются внешними ключами. Это мой вопрос -sql if exists update else insert not working

 IF (EXISTS(SELECT * FROM table1 WHERE col_1 =4)) 
     BEGIN 
     UPDATE table1 
    SET col_2 = 3, 
    col_3 = 100 
     WHERE col_1 = 4 
     END 
     ELSE 
     BEGIN 
     INSERT INTO table1 
    (col_1, col_2, col_3) 
     VALUES(4, 2, 27) 
     END 

Это дает мне синтаксическую ошибку. Двигатель использовал InnoDB. Упорядочение: utf8_swedish_ci

Я попытался это тоже -

   INSERT INTO table1 
    (col1, col2, col3) 
    VALUES 
    (:val1, :val2, :val3) 
    ON DUPLICATE KEY UPDATE 
    col2=:val2, 
    col3=:val3 

Это не работает должным образом и только вставить строки несмотря на имеющие ключи дублирующие.

+1

Почему вы не просто делать '' INSERT' с ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ КЛЮЧА? – Barmar

+0

@Barmar Я пробовал это, но он не работает. Документы заявили, что это вызовет ошибки при наличии нескольких ключей – user983983

+0

в mysql, есть 'replace'. вы можете использовать это – devanand

ответ

0

Попробуйте это:

IF EXISTS (SELECT 1 FROM table1 WHERE col_1 = '4') THEN 
BEGIN 
    UPDATE assignment_question 
    SET col_2 = '3', col_3 = '100' 
    WHERE col_1 = '4'; 
END 
ELSE 
BEGIN 
    INSERT INTO table1 (col_1, col_2, col_3) 
    VALUES (4, 2, 27); 
END 
+0

выберите 1 .... ??? – user983983

+0

@ user983983 Вы можете использовать '*' вместо 1, но для производительности не используйте '*'. Оба будут работать одинаково –

+0

Почему, по вашему мнению, это решит проблему, если '*' должен работать? –

0

Вы можете попробовать следующий код в качестве альтернативы, если существует

SELECT COUNT(*) INTO COUNT FROM TABLE1 WHERE COL_1 = '4' 
IF (COUNT > 0) THEN 
BEGIN 
UPDATE TABLE1 SET COL_2 = '3', COL_3 = '100' WHERE COL_1 = '4'; 
END 
ELSE 
BEGIN 
INSERT INTO TABLE1 (COL_1, COL_2, COL_3) VALUES (4, 2, 27); 
END 

Надеется, что это помогает.

0

Обычно для сценариев, в которых вы хотите: «обновить/удалить существующую запись, если она есть, или вставить новую строку, если запись не существует», вы можете использовать команду MERGE, предоставленную Oracle.

Ссылка: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm

PSB в приведенном ниже примере предоставляется Oracle:

CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100); 

INSERT INTO bonuses(employee_id) 
    (SELECT e.employee_id FROM employees e, orders o 
    WHERE e.employee_id = o.sales_rep_id 
    GROUP BY e.employee_id); 

SELECT * FROM bonuses; 

EMPLOYEE_ID  BONUS 
----------- ---------- 
     153  100 
     154  100 
     155  100 
     156  100 
     158  100 
     159  100 
     160  100 
     161  100 
     163  100 

MERGE INTO bonuses D 
    USING (SELECT employee_id, salary, department_id FROM employees 
    WHERE department_id = 80) S 
    ON (D.employee_id = S.employee_id) 
    WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01 
    DELETE WHERE (S.salary > 8000) 
    WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus) 
    VALUES (S.employee_id, S.salary*0.1) 
    WHERE (S.salary <= 8000); 

EMPLOYEE_ID  BONUS 
----------- ---------- 
     153  180 
     154  175 
     155  170 
     159  180 
     160  175 
     161  170 
     179  620 
     173  610 
     165  680 
     166  640 
     164  720 
     172  730 
     167  620 
     171  740 
0
DELIMITER // 
CREATE PROCEDURE p()                                          
BEGIN 
    IF EXISTS(SELECT * FROM table1 WHERE col_1 = 4) THEN 
     UPDATE table1 SET col_2 = 3, col_3 = 100 WHERE col_1 = 4; 
    ELSE 
     INSERT INTO table1 VALUES(4, 2, 27); 
    END IF; 
END// 
DELIMITER ; 

Проблемы:

  1. должно быть END IF для каждого IF заявления;
  2. Я создал процедуру mysql так согласно documentation:

Если вы используете программу клиента MySQL, чтобы определить, сохраненную программу, содержащие символы точки с запятой, возникает проблема. По умолчанию mysql сам распознает точку с запятой как разделитель инструкций, поэтому вы должны переопределить разделитель временно, чтобы заставить mysql передать все хранимое определение программы на сервер.

0

попытка поставить тогда перед НАЧАТЬ также попытаться положить END IF после последней строки

надежда эта работа:

IF (EXISTS(SELECT * FROM table1 WHERE col_1 =4)) **THEN** 
    BEGIN 
    UPDATE table1 
SET col_2 = 3, 
col_3 = 100 
    WHERE col_1 = 4 
    END 
    ELSE 
    BEGIN 
    INSERT INTO table1 
(col_1, col_2, col_3) 
    VALUES(4, 2, 27) 
    END 
    **END IF** 
Смежные вопросы