Вставить новую строку - но только если она не существует. Если он существует, выберите идентификатор строки, которая будет использоваться в качестве внешнего ключа. - PullRequest
0 голосов
/ 26 марта 2020

Пытался указывать как можно точнее c в заголовке. У меня есть таблица restaurants с внешним ключом category_id. Я хочу ввести данные в мою таблицу категорий

CREATE TABLE categories(
 id PRIMARY KEY,
 main_label,
 sub_category, 
 ); 

Но только если эти данные еще не существуют - что я делаю с

INSERT INTO categories(main_label, sub_category)
SELECT * FROM (SELECT 'yum food', 'alt') AS tmp
WHERE NOT EXISTS (
    SELECT main_label, sub_category FROM categories WHERE mainLabel = 'yum food' && sub_category = 'alt'
) LIMIT 1;

, и это работает.

Если данные уже есть, я (скажем, «yum food» и «alt») хочу выбрать его «id», чтобы я мог ввести их в свою таблицу restaurants.

Моя текущая попытка с ТРАНЗАКЦИЕЙ была ужасной, и я сталкиваюсь с проблемами повсюду (как это будет очевидно при прочтении)

START TRANSACTION;
SET var = SELECT COUNT(*) FROM categories WHERE main_label = 'yum food' && sub_category = 'alt';


IF var > 0 THEN
INSERT INTO categories(main_label, sub_category)
VALUES('yum food', 'alt');
ELSE 
SELECT id FROM categories WHERE main_label = 'yum food' && sub_category = 'alt';
END IF;
COMMIT;

1 Ответ

0 голосов
/ 26 марта 2020

Похоже, я нашел ответ на этот вопрос - по крайней мере, он делает то, что мне нужно. Он проверяет, существуют ли записи и сохраняет ли этот идентификатор. Затем, если запись не существует, она будет вставлена.

DELIMITER $$

CREATE PROCEDURE test(
  name VARCHAR(150),
  sub  VARCHAR(150)
)
BEGIN
  DECLARE cat_id INT DEFAULT 0;

  START TRANSACTION;

  SELECT COUNT(*) 
  INTO @ct
  FROM categories WHERE mainLabel = name && sub_category = sub;

  SET cat_id = @ct;

  IF cat_id =0 THEN
  INSERT INTO categories(mainLabel, sub_category)
  VALUES (name, sub);
  COMMIT;
  ELSE 
  SELECT id 
  INTO @var
  FROM categories WHERE mainLabel = name && sub_category = sub;
  END IF;

END $$
DELIMITER ;


...