我正在尝试使用“插入...在重复密钥更新功能上选择”,但我现在遇到了麻烦。
我想插入数据到‘水果属性’表。
我的查询如下:
START TRANSACTION;
SET @myVal1 := "";
SET @myVal2 := 0;
SET @myVal3 := 0;
SET @myVal4 := 0;
SET @myVal5 := 0;
SELECT masterIndex INTO @myVal1 FROM fruitMaster WHERE masterName = 'apple';
SELECT masterIndex INTO @myVal2 FROM fruitMaster WHERE masterName = 'banana';
SELECT masterIndex INTO @myVal3 FROM fruitMaster WHERE masterName = 'mango';
SELECT masterIndex INTO @myVal4 FROM fruitMaster WHERE masterName = 'melon';
SELECT masterIndex INTO @myVal5 FROM fruitMaster WHERE masterName = 'grape';
INSERT
INTO fruitProperty
(fruitID, masterIndex, cpValue)
SELECT A1.fruitID, A2.masterIndex, A2.cpValue
FROM (
SELECT A.fruitID
FROM fruit A
JOIN fruitProperty B ON A.fruitID = B.fruitID
WHERE B.masterIndex = @myVal1 AND B.cpValue = 1
) A1
CROSS JOIN
(
SELECT @myVal2 AS masterIndex, 1 AS cpValue
UNION
SELECT @myVal3, 1
UNION
SELECT @myVal4, 1
UNION
SELECT @myVal5, 1
) A2
ON DUPLICATE KEY UPDATE cpValue = cpValue + 1;
ROLLBACK;
我遇到一个错误代码。
错误代码:1064您的SQL语法有错误;在第21行“key UPDATE cpValue=1”附近查看与您的MariaDB服务器版本相对应的手册,以获得正确的语法
我的查询有什么问题吗?我真的不知道..
谢谢.
也许您可以不使用交叉连接来简化它。
不幸的是,在MySql中,CROSS JOIN只是INNER JOIN的同义词。
但您不希望最后一个on
关键字被混淆为联接的一部分。
样本数据
create table fruitMaster (masterIndex int primary key, masterName varchar(30));
insert into fruitMaster (masterIndex, masterName) values
(1, 'apple'),(2, 'banana'),(3, 'mango'),(4, 'melon'),(5, 'grape'), (6, 'prune');
create table fruit (fruitID int primary key, fruitName varchar(30));
insert into fruit (fruitID, fruitName) values
(10,'jonagold'),(20,'straight banana'),(40,'big melons');
create table fruitProperty (
fruitID int, masterIndex int, cpValue int,
primary key (fruitID, masterIndex));
insert into fruitProperty (fruitID, masterIndex, cpValue) values
(10, 1, 1),(10, 2, 1),(10, 6, 1),
(20, 2, 1),(30, 3, 1),(40, 4, 1);
插入查询
INSERT INTO fruitProperty (fruitID, masterIndex, cpValue)
SELECT F.fruitID, FM2.masterIndex, 1 AS cpValue
FROM fruit F
JOIN fruitProperty FP ON (FP.fruitID = F.fruitID AND FP.cpValue = 1)
JOIN fruitMaster FM1 ON (FM1.masterIndex = FP.masterIndex AND FM1.masterName = 'apple')
JOIN fruitMaster FM2 ON FM2.masterName IN ('banana', 'mango', 'melon', 'grape')
ON DUPLICATE KEY UPDATE cpValue = 2;
结果:
SELECT * FROM fruitProperty;
fruitID | masterIndex | cpValue ------: | ----------: | ------: 10 | 1 | 1 10 | 2 | 2 10 | 3 | 1 10 | 4 | 1 10 | 5 | 1 10 | 6 | 1 20 | 2 | 1 30 | 3 | 1 40 | 4 | 1
DB<>在此拨弄
如果使用显式join
,是否会遇到问题:
INSERT INTO fruitProperty (fruitID, masterIndex, cpValue)
SELECT f.fruitID, A2.masterIndex, A2.cpValue
FROM (SELECT f.fruitID
FROM fruit f JOIN
fruitProperty fp
ON f.fruitID = fp.fruitID
WHERE f.masterIndex = @myVal1 AND fp.cpValue = 1
) f JOIN
(SELECT @myVal2 AS masterIndex, 1 AS cpValue
UNION ALL
SELECT @myVal3, 1
UNION ALL
SELECT @myVal4, 1
UNION ALL
SELECT @myVal5, 1
) A2
ON 1=1
ON DUPLICATE KEY UPDATE cpValue = VALUES(cpValue) + 1;
我怀疑这个问题是一个解析问题,因为MySQL/MariaDB支持交叉连接
的on
子句(yuck!!!)。但是on
关键字会被混淆。
问题内容: 在SQLAlchemy中有一种优雅的方法吗?我的意思是语法类似于? 问题答案: 现在,仅在MySQL的SQLAlchemy中内置了此功能。somada141的以下答案是最佳解决方案:https ://stackoverflow.com/a/48373874/319066 在SQL语句中 如果希望生成的SQL实际上包含,则最简单的方法涉及使用装饰器。 的代码(来自关于该主题的很好的螺纹连
我找遍了,但没有找到是否可能。 我有一个MySQL查询: 字段id有一个“唯一索引”,所以不能有两个。现在,如果数据库中已经存在相同的id,我想更新它。但我真的必须再次指定所有这些字段吗,比如: 或: 我已经在插入中指定了所有内容。。。 一个额外的注意事项,我想使用周围的工作来获得ID! 我希望有人能告诉我什么是最有效的方法。
我有一个具有两列主键的表。 未捕获的异常“PDOException”,包含消息“SQLSTATE[23000]”:完整性约束违反:1062中键“Primary”的重复项“157-433”... 为什么它不只是更新现有的(157,433)-行?
我正在尝试使用文档在我的Laravel 5.1应用程序上重置密码。当我点击send password reset(发送密码重置)按钮时,会出现以下错误。 QueryException in Connection.php第651行:SQLSTATE[42S22]:未找到列:1054“where子句”中的未知列“email”(SQL:delete fromwhere=abc@abc.com).
我有一个现有的密钥库,里面有一个密码,还有几个不同密码的密钥,供我导出并上传到Google Play的不同应用程序使用。 现在,我最近导入了一个应用程序的项目,对它做了一些重大的修改,我正在尝试使用相同的密钥库和选择相同的别名/密码来导出它,就像我最初创建它时一样。 问题是,在我选择密钥别名并输入密钥密码的步骤之后,我看到“错误:无法恢复密钥”。 我怀疑我可能输入了一个错误的密钥密码(注意密钥库密
我有两个表:和。第一个是自定义表,第二个是wordpress表。 我想更改中所有符合以下条件的帖子类型:与中的相同,并且键等于41。 我试着选择那些帖子 并返回正确的帖子(我在phpmyadmin中这样做)。 所以我试着 #1064-您的SQL语法有错误;查看与您的MariaDB服务器版本相对应的手册,了解在第1行“from wp_posts JOIN table1 ON table1.headl