开发者社区 问答 正文

SQLSTATE [23000]:违反完整性约束:1048 /Notite-Applicatie/a

我试图将登录令牌存储在数据库中,但是出现多个错误。我到处看,但找不到解决方案。

我尝试了多种操作,对于id列,我尝试为null,

我尝试这样做:

DB::query('INSERT INTO login_token (token, user_id) VALUES (null, :token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));

但是然后我得到这个错误:SQLSTATE [HY000]:常规错误:1364字段“ id”没有默认值

最后,我尝试使用:(''),但这是针对字符串而非整数

这是我当前的代码:

$cstrong = True;
$token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));

$user_id = DB::query('SELECT user_id FROM user WHERE username = :username', array(':username'=>$username))[0]['user_id'];
DB::query('INSERT INTO login_token VALUES (null, :token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));

数据库表如下:

id int

令牌字符(64)

user_id int

也许有人可以帮助我解决这个问题

展开
收起
几许相思几点泪 2019-12-08 22:13:59 518 分享 版权
阿里云 AI 助理回答

根据你的描述,你遇到的问题是由于在尝试插入数据时,数据库表的id字段没有默认值,且你在插入语句中明确指定了该列为null,而id字段看起来像是一个自增字段(通常用于主键)。在MySQL中,如果一个列被定义为自增(AUTO_INCREMENT),你不应该手动插入任何值,包括NULL

解决这个问题的方法很简单,就是直接从你的插入语句中移除对id列的任何操作,因为数据库会自动为这个字段生成下一个可用的唯一ID。修改后的代码如下:

$cstrong = true;
$token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));

$user_id = DB::query('SELECT user_id FROM user WHERE username = :username', array(':username'=>$username))[0]['user_id'];
// 仅插入token和user_id,id列由数据库自动生成
DB::query('INSERT INTO login_token (token, user_id) VALUES (:token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));

这样,当你执行插入操作时,数据库会自动处理id列的值,你应该不会再看到那个错误了。同时,请确保你的login_token表的id字段确实被设置为了自增类型。如果还没有设置,可以通过以下SQL语句来修改(请先备份你的数据库):

ALTER TABLE login_token MODIFY id INT AUTO_INCREMENT PRIMARY KEY;

这将把id列设置为自增主键,前提是它还没有被用作其他用途的主键。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: