Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysqli中的输出Inserted.row_Mysql_Mysql Error 1064_Sql Server - Fatal编程技术网

mysqli中的输出Inserted.row

mysqli中的输出Inserted.row,mysql,mysql-error-1064,sql-server,Mysql,Mysql Error 1064,Sql Server,我有以下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语法有错误;检查与您

我有以下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”附近

有什么问题吗?

不幸的是(据我所知)不支持
输出

您可以选择在单行插入中尝试完成的操作(假设自动递增主键):


不幸的是,在批量插入的情况下不起作用,尽管在您的情况下不起作用(至少在您的示例中不起作用),所以这应该是好的

如果您使用的是php,那么最好使用以下代码:

 if ($conn->query($sql) === TRUE) {
  $last_id = $conn->insert_id;
    echo "New record created successfully. Last inserted ID is: " . $last_id;
 } else {
   echo "Error: " . $sql . "<br>" . $conn->error;
  }
if($conn->query($sql)==TRUE){
$last\u id=$conn->insert\u id;
echo“已成功创建新记录。上次插入的ID为:.$Last\u ID;
}否则{
echo“Error:”.$sql.“
”$conn->Error; }

其中$conn是连接变量。

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

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

警告

如果您在PHP中这样做,请考虑在过程中使用GUID列而不是CueDeBy。在PHP中这样做很重要,因为在插入记录和尝试检索ID之间,连接可能会丢失,而使用连接ID创建的数据库将变得无用。但是,如果您有一个用PHP创建的GUID,则可以循环直到连接成功,或者使用保存在文件某处的GUID进行恢复。出于我的目的,不需要这种级别的连接安全性,因此我不会这样做

此解决方案的关键是CreatedBy是连接id,与执行插入的作业或过程的名称结合在一起,CreatedDate是保存在通过以下代码使用的变量内的当前时间戳。假设您有一个名为“TestTable”的表。其结构如下:

测试“插入”表 用于存储插入ID的临时表 这个临时表将保存插入TestTable的行的主键ID。它的结构很简单,只有一个字段,它既是临时表的主键,也是插入表(TestTable)的主键

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

@by的一个示例是:CONID(576)BuildTestTableData

请注意,使用指示连接id的内容封装连接id是很重要的,因为它被用作一个字段中其他信息的“组合”

一个关于@now的例子:“2016-03-11 09:51:10”

请注意,使用LEFT(50)封装@by非常重要,以避免在插入CreatedBy VARCHAR(50)列时出现截断错误。我知道这种情况发生在sql server中,但对mysql不太确定。如果mysql在截断数据时没有抛出异常,则会出现一个静默错误,即在字段中插入截断值,然后匹配检索失败,因为您试图将字符串的非截断版本与字符串的截断版本相匹配。如果mysql在插入时不进行截断(即,它不强制执行类型值限制),那么这就不是一个真正的问题。根据我的sql server经验,我是按照标准做法来做的

SET @by = LEFT(CONCAT('CONID(', CONNECTION_ID(), ') BuildTestTableData'), 50);
SET @now = CURRENT_TIMESTAMP;
插入到测试表中 在测试表中插入,指定CreatedBy和CreatedDate为@by和@now

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
;
用检索到的信息做任何事情
当问题似乎是关于你的时候,你为什么要加标签?@Kritner对不起,我的错。我已经删除了sql server标记您是否签入php?@saumik是的,我正在使用phpThanks作为您的答案将CONID添加到@by以解决多用户场景问题。我相信这个解决方案现在已经足够用于典型用途了。
SET @by = LEFT(CONCAT('CONID(', CONNECTION_ID(), ') BuildTestTableData'), 50);
SET @now = CURRENT_TIMESTAMP;
INSERT INTO TestTable (
      Name
    , CreatedBy
    , CreatedDate
)
SELECT Name
     , @by
     , @now
FROM SomeDataSource
WHERE BusinessRulesMatch = 1
;
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
;