热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在mysqli中输出Inserted.row

如何解决《在mysqli中输出Inserted.row》经验,为你挑选了1个好方法。

我有以下sql表:

ID |电子邮件| FBID

当我执行查询

 INSERT INTO users(email,fbid) VALUES('randomvalue','otherrandomvalue')

我想获取插入行的id.为此,我尝试编辑这样的查询:

 INSERT INTO users(email,fbid) VALUES('randomvalue','otherrandomvalue') OUTPUT Inserted.id

但是我得到了:

1064 - 您的SQL语法出错; 检查与MySQL服务器版本对应的手册,以便在第1行的"OUTPUT Inserted.id"附近使用正确的语法

可能是什么问题呢?



1> Bill Stidham..:

我将使用我在下面描述的过程处理与我为个人使用而编写的私人家庭(非企业)应用程序相同的情况.我知道这个问题现在已经有一年了,但批量处理似乎没有足够的答案.我找不到合适的答案.MySQL似乎没有内置设施来处理这类事情.

我担心这个解决方案的可靠性,当放入生产环境中时,多个不同的用户/作业可以同时访问相同的程序来进行插入.我相信我通过在@by变量赋值中添加连接ID来解决这些问题.这样做使得by具有:会话的连接ID和b:执行插入的程序/作业/过程的名称.结合插入的日期和时间,我相信这三个值提供了一个非常安全的密钥来检索正确的插入行集.如果需要绝对确定性,您可以添加GUID类型的第三列(或varchar)生成要插入的GUID变量,然后使用GUID变量以及@by和@now作为键.我认为这对我的目的是不必要的,因为我要使用它的过程是一个在服务器而不是PHP上运行的事件(作业)脚本.所以除非有人要求,否则我不会举例说明.

警告

如果您在PHP中执行此操作,请考虑在流程中使用GUID列而不是CreatedBy.在PHP中执行此操作非常重要,因为在插入记录和尝试检索IDS之间可能会丢失连接,并且连接ID的CreatedBy将变得无用.但是,如果您具有在PHP中创建的GUID,则可以循环直到连接成功或使用保存在文件中某处的GUID进行恢复.为了我的目的,不需要这种级别的连接安全性,所以我不会这样做.

此解决方案的关键是CreatedBy是连接ID与正在执行插入的作业或过程的名称相结合,而CreatedDate是一个CURRENT_TIMESTAMP,它保存在通过以下代码使用的变量中.假设您有一个名为"TestTable"的表.它具有以下结构:

测试"插入"表

CREATE TABLE TestTable (
      TestTableID INT NOT NULL AUTO_INCREMENT
    , Name VARCHAR(100) NOT NULL
    , CreatedBy VARCHAR(50) NOT NULL
    , CreatedDate DATETIME NOT NULL
    , PRIMARY KEY (TestTableID)
);

Temp表用于存储插入的ID

此临时表将保存插入TestTable的行的主键ID.它只有一个字段的简单结构,它既是临时表的主键,也是插入表的主键(TestTable)

DROP TEMPORARY TABLE IF EXISTS tTestTablesInserted;
CREATE TEMPORARY TABLE tTestTablesInserted(
      TestTableID INT NOT NULL
    , PRIMARY KEY (TestTableID)
);

变量

这个很重要.您需要将CreatedBy和CreatedDate存储在变量中.CreatedBy存储用于一致性/编码实践,CreatedDate非常重要,因为您将使用它作为检索插入行的键.

@by的示例:CONID(576)BuildTestTableData

请注意,将连接ID​​封装为指示它的内容非常重要,因为它被用作"复合",并在一个字段中包含其他信息

@now的样子:'2016-03-11 09:51:10'

请注意,使用LEFT(50)封装@by非常重要,以避免在插入CreatedBy VARCHAR(50)列时跳过截断错误.我知道这发生在sql server中,对mysql不太确定.如果mysql在截断数据时没有抛出异常,则在您将截断的值插入字段然后匹配检索失败的情况下,静默错误可能会持续存在,因为您尝试将字符串的非截断版本与截断的匹配字符串的版本.如果mysql在插入时没有截断(即它没有强制类型值限制),那么这不是一个真正的问题.我是从我的SQL服务器经验中的标准练习中完成的.

SET @by = LEFT(CONCAT('CONID(', CONNECTION_ID(), ') BuildTestTableData'), 50);
SET @now = CURRENT_TIMESTAMP;

插入TestTable

插入测试表,指定@by和@now的CreatedBy和CreatedDate

INSERT INTO TestTable (
      Name
    , CreatedBy
    , CreatedDate
)
SELECT Name
     , @by
     , @now
FROM SomeDataSource
WHERE BusinessRulesMatch = 1
;

检索插入的ID

现在,使用@by和@now检索测试表中插入行的ID

INSERT INTO tTestTablesInserted (TestTableID)
SELECT TestTableID
FROM TestTable
WHERE CreatedBy = @by
  AND CreatedDate = @now
;

通过检索信息做任何事情

/*DO SOME STUFF HERE*/
SELECT * 
FROM tTestTablesInserted tti
JOIN TestTable tt
    ON tt.TestTableID = tti.TestTableID
;


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
author-avatar
susan0912010311fool
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有