mysql - 插入新行 - 但前提是它不存在。如果确实存在,则选择要用作外键的行的 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;
解决方案
看起来我已经找到了答案 - 至少它正在做我需要它做的事情。它检查条目是否存在以及是否存在 - 存储该 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 ;
推荐阅读
- cordova - 科尔多瓦插件问题,未运行
- javascript - 如果某个 Json 属性为 null 或“”,则从 DOM 中删除元素
- django - 通过多列子查询 Django
- python-3.x - AttributeError:模块'cv2.cv2'没有属性'rectange'
- excel - 单元格的vba颜色
- openshift - Openshift登录插件Jenkins - 无效请求
- c++ - 在 argv 主要参数中传递 const char
- javascript - Safari 上随机出现的动画和动画延迟
- symfony - 更新奏鸣曲核心后的错误奏鸣曲.core.form.type.*
- mql4 - 以编程方式更改策略测试器中的时间范围