【问题标题】:Force Yii to save new record with specific ID on auto_increment column?强制 Yii 在 auto_increment 列上保存具有特定 ID 的新记录?
【发布时间】:2013-12-07 16:19:47
【问题描述】:

例如:我创建新模型,将 id 字段设置为 1 并保存。它运行良好并以 id = 1 保存到数据库中。我打开 MySQL 控制台并从表中删除所有记录。当我删除它时,再次创建新模型并将 id 字段设置为 1 - 它实际上将其保存为 2 作为 id 字段值。

我猜 Yii 从 mysql 获取当前的 auto_increment 值并覆盖我的 id 值。有没有办法防止这种行为?

编辑(我的代码示例):

$sn = new SaplingNode();
$sn->id = 1;
$sn->save();

我调用它两次,在调用之间我使用 mysql 控制台删除记录。就是这样。

【问题讨论】:

  • Yii 自己重新实现自动增量是荒谬的,数据库是处理这个问题的正确地方。如果有的话,Yii 更有可能没有将您的特定值分配给主键字段并让自动增量完成其工作,但是如果没有您的代码,就无法判断是否真的如此。
  • @DCoder - 我不想让 Yii 重新实现自动增量,而是用我指定的 id 进行简单的插入。我添加了代码,但实际上并不相关,因为它很简单创建和保存模型。

标签: php mysql yii auto-increment


【解决方案1】:

Yii 框架没有办法做到这一点。作为 MYSQL 的默认行为。

您可以简单地执行此操作并在截断后重置自动增量 ID。

ALTER TABLE tablename AUTO_INCREMENT = 1

【讨论】:

  • 严格来说并非如此。如果在插入查询中未指定 id,Mysql 将自动递增。您可以为 id 指定一个值,mysql 将使用它。但这并不理想,除非您编写自己的更新查询,否则 Yii 不支持此方法。
  • 完美答案(+1)!旁注/问题:Is there any way to do this in migration, using CDbMigration?
【解决方案2】:

这不是最佳实践,但如果你真的想在自动增量列上强制设置新记录的 id,你可以这样做:

首先在“SaplingNode”模型的 rules() 方法下放入以下行:

array('id', 'safe'),

然后使用您的代码以您喜欢的任何 id 保存新记录,例如:

$sn = new SaplingNode();
$sn->id = 10;
$sn->save();

这段代码应该可以工作,我已经测试过了。

【讨论】:

    【解决方案3】:

    正如您目前使用的那样,答案是否定的,您不能这样做,不能使用 CActiveRecord。这样做的原因是 Yii 正在根据它的主键检索要更新的记录,并且不会覆盖它。覆盖主键的唯一方法是通过 CDbCommandBuilder 编写您自己的更新查询。

    顺便说一句:在 Yii 论坛上有 an interesting discussion 的主题。

    【讨论】:

    • 其实我没有更新。我创建了一个全新的对象,并在保存之前设置了 ID。我期待它用我的 id 保存它,但它没有。无论如何,感谢您的链接,这确实是有趣的讨论。我想所以我最终需要使用命令生成器。谢谢。
    【解决方案4】:

    你试过了吗

    $sn = new SaplingNode();
    $sn->setPrimaryKey(1); 
    $sn->save();
    

    Yii primary key

    【讨论】:

      【解决方案5】:

      如果您只是测试并且可以从表中删除所有数据,则可以清空表。例如,您可以使用 phpMyAdmin,单击您的数据库以查看其表,找到您想要的表并单击该表行上显示的空。您将收到一条确认消息,选择启用或禁用 FK,单击确定,该表上的所有数据将被删除,并且在保存或插入新记录时,您的自动增量 ID 将从 1 开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 2016-09-20
        • 2019-06-22
        相关资源
        最近更新 更多