不是"化名",而是类似...

我正在使用一个不完整的MySQL数据库,从外部引用添加重复的手动更新.这是缓慢的,我希望精简一个我已经使用了几十次的SELECT.我前面还有几千个这样的.

我已经看到了关于创建PROCEDURES的建议,但是由于我试图"别名"一个部分查询,我可能问错了问题.

我想把这一点浓缩一下:

SELECT book, fulltitle, author, num, lastread, category FROM books 

...类似这样的东西:

sBk

所以我输入sBk WHERE book="success";,MySQL执行:

SELECT book, fulltitle, author, num, lastread, category FROM books WHERE book="success";

一致性R.I.P.

在我的数据中,大多数作者都是未定义的——我的任务就是解决这个问题. 所以我在参考资料中搜索这位作者的书,然后更新记录.

有些书的名字是可以预见的,例如:john1,john2,john3. 其他的则不是,例如jrs2、smithj9、fourteen 1、AllYourBase等.因此,命令通常看起来像这样:

SELECT book, fulltitle, author, num, lastread, group FROM books WHERE book like \
  "artp1%" OR book LIKE "aod%" OR book LIKE "fatal%" OR book LIKE "outside%" OR \
  book LIKE "geo-cache%" OR book LIKE "frostbite" OR book LIKE "quickb3%" OR book \
  LIKE "instantcof%" OR book = "sevenmile" OR book = "uberfast";

所以我点击向上箭头,删除第一部分,然后输入author=得到这个:

UPDATE books SET author="John Smith" WHERE book LIKE (everything above)";

查找和图书/作者关联都是手动的,我无法更改这一点.但是,一旦我得到与所有正确书籍匹配的SELECT语句,就必须有一种更智能的方法来执行这些数据更新.


我所try 的--以及注意事项

  • books表有几十列,或者我只需要select *列.

  • 我可以从前面的SELECT中复制/粘贴,但我对鼠标不感兴趣,这让它变得和使用Delete键一样慢.

  • 如果MySQL有一个基本上是"对前面的SELECT执行操作"的函数,那就太好了.但是,如果存在这样的函数,我就无法搜索正确的术语来找到它.

我试过creating a procedure,但是我不能让它接受一个部分命令——而且这个错误不是很好的描述性——有什么方法可以纠正我在这里做的事情吗?

CREATE PROCEDURE sBk()  BEGIN SELECT book, fulltitle, author, num, lastread, category from books END;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that \
  corresponds to your MySQL server version for the right syntax to use near '' at line 1

匹配一本书很简单:点击上一个UPDATE命令,编辑,继续.然而,许多命令的长度和复杂性几乎扼杀了简单的[UpArrow]在前一个语句中的优势.

推荐答案

语法错误的原因是您没有设置DELIMITER,并且您的过程包含BEGIN...END块.阅读https://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html了解这方面的细节.

在定义存储过程之后,可以这样调用它:

mysql> CALL sBk();

但这是你唯一可以预测的方式.不能将WHERE子句添加到CALL语句.它不是查询的别名.

你可以考虑VIEW,而不是手术.

至于使用向上箭头来编辑前面的语句时遇到的困难,您可能会在mysql客户端中使用edit\e命令,而不是向上箭头.此命令打开一个文本编辑器,如vi(或任何EDITORVISUAL环境变量名).这使您可以更好地控制如何编辑SQL语句.

Mysql相关问答推荐

如何重新采样SQL数据库

一次又一次地删除事件行

MySQL多连接以获得单个结果集(使用MySQL max函数)

含有子查询的MySQL函数出现语法错误

使用 presto 或 mysql 添加每个组中的缺失值

将类图转换为SQL数据库

MySQL MDL(元数据锁)为什么会导致死锁?

实体内约束的唯一增量 ID 生成

MySQL 8.0 可以在 Select 语句中返回 JSON 对象数组吗?

如何根据 R 中的价格范围将数据从一列复制到新列?

如何使用 DBD::mysql 判断 MySQL 服务是否正在运行

MySQL表中给定字段的每个不同值的连续记录形成对

在mysql中将纪元数转换为人类可读的日期

如何在 MySQL 上一次删除一系列记录?

如何使主键从 1000 开始?

在 MYSQL 中按枚举字段排序

WHERE 子句中的条件顺序会影响 MySQL 性能吗?

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

按 COUNT(*) 过滤?

mysql GROUP_CONCAT 重复