强制Yii在auto_increment列上保存具有特定ID的新记录?

时间:2013-12-07 16:19:48

标签: php mysql yii auto-increment

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

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

编辑(我的代码示例):

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

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

5 个答案:

答案 0 :(得分:2)

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

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

ALTER TABLE tablename AUTO_INCREMENT = 1

答案 1 :(得分:1)

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

BTW:在Yii论坛上有关于这个主题的an interesting discussion

答案 2 :(得分:1)

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

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

array('id', 'safe'),

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

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

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

答案 3 :(得分:0)

你试过吗

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

Yii primary key

答案 4 :(得分:0)

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