是否可以一个接一个地INSERT然后选择插入的行?

时间:2013-01-07 18:37:09

标签: mysql select insert

我执行两个查询一个接一个:一个是INSERT另一个是SELECT,它选择插入的行。 虽然行已成功插入(我可以在数据库中看到它),但是select查询无法返回该行。

当我再次执行SELECT查询时,它会返回正确的结果。

插入

    $stmt = $pdo->prepare('INSERT INTO user (id ,name, lastname ,birthday, social_type, social_id) VALUES(NULL, :name, :lastname, :birthday, :social_type, :social_id)');
    $success=$stmt->execute(array(
        ':name' => $user['name'],
        ':lastname' => $user['lastname'],
        ':birthday' => $user['birthday'],
        ':social_type' => $user['social_type'],
        ':social_id' => $user['social_id']      
    ));

选择

    $stmt = $pdo->prepare('SELECT * FROM user WHERE social_id = :social_id AND social_type = :social_type LIMIT 1');
    $stmt->execute(array(
        'social_id' => $user['social_id'],
        'social_type' => $user['social_type'] ));
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

1 个答案:

答案 0 :(得分:2)

如果您正在使用INNODB:

如果您正在使用INNODB,因为您确认已插入行,它应该是 只要SELECT查询实际行的键,就返回SELECT 已插入。 (你确定你没有使用像INSERT DELAYED这样的功能吗?那个 可能会阻止该行返回。)

如果您使用MYISAM:

由于MyISAM不支持事务,SELECT应该返回插入,但是我 找不到任何说明这实际上有保证的东西。

注意:下面列出的第一个URL表明您使用的是MYISAM(根据此链接的默认值), INSERTS将锁定表格。但是,第二个URL指出插入的锁是一个可读锁,因此不应该阻止读取表。

http://www.sitepoint.com/mysql-mistakes-php-developers/

http://aarklondatabasetrivia.blogspot.com/2009/04/how-to-lock-and-unlock-tables-in-mysql.html

如果您正在使用INNODB(续):

    如果你的系统正在使用AUTOCOMMIT(我不确定)你应该看到     选定的行(此问题表明插入的行已被验证为具有     已被添加到数据库中。)

    如果正在使用某个事务,则该事务必须已提交(此问题 说明插入的行已经过验证,已被添加到数据库中。

    您确定第一次执行的SELECT查询是否相同 作为第二次的那个?

    您确定$user['social_id']之后的值是否相同 INSERT和SELECT时的时间?

    如果出于某种原因,您使用INSERT DELAYED,则可能不会返回该行

<小时/>

注意: 根据此URL,如果您已启动一个事务,则选择所选行 显示在下一个SELECT语句中(不在PHP中):

http://zetcode.com/databases/mysqltutorial/transactions/

此声明暗示如果您开始交易,则不需要 设置AUTOCOMMIT:

“MySQL还会自动提交不属于交易的语句。”

此URL描述了如何在PHP中启动事务:

PHP + MySQL transactions examples