2017-01-10 4 views
0

Я пытаюсь обновить таблицу db, проверив, существует ли мой столбец product_number. Я знаю, что вы можете использовать INSERT OR UPDATE ON DUPLICATE KEY, но столбец, который я пытаюсь использовать, не является первичным ключом.Вставить или обновить, если он не используется Первичный ключ

Я нашел следующий запрос в столбце стека, но я продолжаю получать ошибку Unrecognized statement type. (near Duplicate), когда я пытаюсь запустить ее с помощью phpMyAdmin.

DECLARE @numrecords INT 
SELECT @numrecords = count(*) 
        FROM users_remark 
        WHERE product_number = '444' 
        IF @numrecords > 0 THEN 
         UPDATE products 
         SET product_name = 'abc', 
          product_description = def, 
          product_detail = '', 
          product_price = '100', 
          product_price_canada = '200' 
          WHERE product_number = '444' 
        ELSE 
         INSERT INTO products (product_number, product_name, product_description, product_price) 
         VALUES (444, abc, def, 100) 
        END IF 

Почему этот запрос не работает?

Есть ли лучший способ достичь того, чего я пытаюсь достичь?

+0

Дубликат или Признаться? Похоже, вы пытаетесь использовать что-то вроде оракула? – Farkie

+0

Вы хотите, чтобы 'product_number' был уникальным, но это не первичный ключ таблицы. Вы не знаете, что такое первичный ключ, пока вы не получите запись через 'product_number'? Похоже, вы собираетесь сражаться в гору, если не сможете изменить таблицу. Может быть, построить индекс product_numbers? Если вы не разрешаете доступ к этой таблице нигде, у вас есть условие гонки. – NKijak

+0

@NKijak Идеальной ситуацией было бы иметь номер продукта в качестве первичного ключа, но наш клиент изменил то, как они называют продукты, поэтому мы все еще находимся в процессе изменения приложения. До тех пор мне нужно, чтобы это работало, чтобы обновить таблицу продуктов. – bos570

ответ

0

Я создал процедуру для вас:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS insert_or_update $$ 
CREATE PROCEDURE insert_or_update(pProduct_number INT, pProduct_name VARCHAR(200), pProduct_description VARCHAR(200), pProduct_detail VARCHAR(200), pProduct_price FLOAT(15,2), pProduct_price_canada FLOAT(15,2)) 
BEGIN 

    DECLARE numrecords INT;  
    SELECT count(*) INTO numrecords FROM products WHERE product_number = pProduct_number; 
     IF numrecords > 0 THEN 
      UPDATE products SET 
       product_name = pProduct_name, 
       product_description = pProduct_description, 
       product_detail = pProduct_detail, 
       product_price = pProduct_price, 
       product_price_canada = pProduct_price_canada 
      WHERE product_number = pProduct_number; 
     ELSE 
      INSERT INTO products (product_number, product_name, product_description, product_price) 
      VALUES (pProduct_number, pProduct_name, pProduct_description, pProduct_price); 
     END IF; 

END $$ 

DELIMITER ; 

Для вызова только:

CALL insert_or_update(444, , 'abc', 'def', '', '100', '444'); 
+0

только что закончил тем, что написал аналогичную процедуру, и она работает. Цените помощь. – bos570

Смежные вопросы