首页 > 解决方案 > 插入新行 - 但前提是它不存在。如果确实存在,则选择要用作外键的行的 id

问题描述

试图在标题中尽可能具体。我有一个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表中。

我目前对 TRANSACTION 的尝试非常糟糕,我到处都遇到了问题(当您继续阅读时会非常明显)

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;

标签: mysqltransactionsprocedure

解决方案


看起来我已经找到了答案 - 至少它正在做我需要它做的事情。它检查条目是否存在以及是否存在 - 存储该 ID。然后,如果该条目不存在,它将插入它。

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 ;



推荐阅读